From a69753836928bab0cc4c3a2e6fc127572c1787bf Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Fri, 9 Dec 2022 20:01:26 -0500 Subject: [PATCH] internal/backport: delete Now that the deploy happens with Go 1.19, it's viable to start using these packages from the standard library instead of their backported temporary copies. Keeping Go 1.18 happy during its last two months of support requires a tiny complication in pkgdoc package. An alternative path is to not drop internal/backport/go/doc and all of its dependencies right away, but getting to zero backported packages sooner was hard to resist... For golang/go#51800. Change-Id: Ieb7a137a033d6b6850dfc019c8c0c767756cc30d Reviewed-on: https://go-review.googlesource.com/c/website/+/456522 Reviewed-by: Bryan Mills TryBot-Bypass: Dmitri Shuralyov Reviewed-by: Dmitri Shuralyov Auto-Submit: Dmitri Shuralyov Run-TryBot: Dmitri Shuralyov --- cmd/golangorg/server.go | 4 +- cmd/googlegolangorg/main.go | 3 +- internal/api/api_test.go | 3 +- internal/backport/README.md | 10 - internal/backport/diff/diff.go | 261 -- internal/backport/diff/diff_test.go | 44 - internal/backport/diff/testdata/allnew.txt | 13 - internal/backport/diff/testdata/allold.txt | 13 - internal/backport/diff/testdata/basic.txt | 35 - internal/backport/diff/testdata/dups.txt | 40 - internal/backport/diff/testdata/end.txt | 38 - internal/backport/diff/testdata/eof.txt | 9 - internal/backport/diff/testdata/eof1.txt | 18 - internal/backport/diff/testdata/eof2.txt | 18 - internal/backport/diff/testdata/long.txt | 62 - internal/backport/diff/testdata/same.txt | 5 - internal/backport/diff/testdata/start.txt | 34 - internal/backport/diff/testdata/triv.txt | 40 - internal/backport/fmtsort/sort.go | 219 -- internal/backport/go/ast/ast.go | 1067 ------ internal/backport/go/ast/ast_test.go | 82 - internal/backport/go/ast/commentmap.go | 329 -- internal/backport/go/ast/commentmap_test.go | 170 - internal/backport/go/ast/example_test.go | 206 -- internal/backport/go/ast/filter.go | 488 --- internal/backport/go/ast/filter_test.go | 85 - internal/backport/go/ast/import.go | 230 -- internal/backport/go/ast/issues_test.go | 42 - internal/backport/go/ast/print.go | 255 -- internal/backport/go/ast/print_test.go | 97 - internal/backport/go/ast/resolve.go | 173 - internal/backport/go/ast/scope.go | 156 - internal/backport/go/ast/walk.go | 398 --- internal/backport/go/build/build.go | 1970 ----------- internal/backport/go/build/doc.go | 97 - internal/backport/go/build/gc.go | 18 - internal/backport/go/build/gccgo.go | 15 - internal/backport/go/build/read.go | 578 ---- internal/backport/go/build/read_test.go | 360 -- internal/backport/go/build/syslist.go | 11 - internal/backport/go/build/syslist_test.go | 62 - internal/backport/go/doc/Makefile | 7 - internal/backport/go/doc/comment.go | 72 - internal/backport/go/doc/comment/doc.go | 36 - internal/backport/go/doc/comment/html.go | 169 - internal/backport/go/doc/comment/markdown.go | 188 -- internal/backport/go/doc/comment/mkstd.sh | 24 - internal/backport/go/doc/comment/old_test.go | 80 - internal/backport/go/doc/comment/parse.go | 1271 ------- .../backport/go/doc/comment/parse_test.go | 12 - internal/backport/go/doc/comment/print.go | 290 -- internal/backport/go/doc/comment/std.go | 44 - internal/backport/go/doc/comment/std_test.go | 35 - .../go/doc/comment/testdata/README.md | 42 - .../go/doc/comment/testdata/blank.txt | 12 - .../backport/go/doc/comment/testdata/code.txt | 94 - .../go/doc/comment/testdata/code2.txt | 31 - .../go/doc/comment/testdata/code3.txt | 33 - .../go/doc/comment/testdata/code4.txt | 38 - .../go/doc/comment/testdata/code5.txt | 21 - .../go/doc/comment/testdata/code6.txt | 24 - .../go/doc/comment/testdata/crash1.txt | 16 - .../go/doc/comment/testdata/doclink.txt | 21 - .../go/doc/comment/testdata/doclink2.txt | 8 - .../go/doc/comment/testdata/doclink3.txt | 8 - .../go/doc/comment/testdata/doclink4.txt | 7 - .../go/doc/comment/testdata/doclink5.txt | 5 - .../go/doc/comment/testdata/doclink6.txt | 5 - .../go/doc/comment/testdata/doclink7.txt | 4 - .../go/doc/comment/testdata/escape.txt | 55 - .../backport/go/doc/comment/testdata/head.txt | 92 - .../go/doc/comment/testdata/head2.txt | 36 - .../go/doc/comment/testdata/head3.txt | 7 - .../go/doc/comment/testdata/hello.txt | 35 - .../backport/go/doc/comment/testdata/link.txt | 17 - .../go/doc/comment/testdata/link2.txt | 31 - .../go/doc/comment/testdata/link3.txt | 14 - .../go/doc/comment/testdata/link4.txt | 77 - .../go/doc/comment/testdata/link5.txt | 36 - .../go/doc/comment/testdata/link6.txt | 50 - .../go/doc/comment/testdata/link7.txt | 25 - .../go/doc/comment/testdata/linklist.txt | 18 - .../go/doc/comment/testdata/linklist2.txt | 39 - .../go/doc/comment/testdata/linklist3.txt | 31 - .../go/doc/comment/testdata/linklist4.txt | 36 - .../backport/go/doc/comment/testdata/list.txt | 48 - .../go/doc/comment/testdata/list10.txt | 13 - .../go/doc/comment/testdata/list2.txt | 57 - .../go/doc/comment/testdata/list3.txt | 32 - .../go/doc/comment/testdata/list4.txt | 38 - .../go/doc/comment/testdata/list5.txt | 40 - .../go/doc/comment/testdata/list6.txt | 129 - .../go/doc/comment/testdata/list7.txt | 98 - .../go/doc/comment/testdata/list8.txt | 56 - .../go/doc/comment/testdata/list9.txt | 30 - .../backport/go/doc/comment/testdata/para.txt | 17 - .../go/doc/comment/testdata/quote.txt | 15 - .../backport/go/doc/comment/testdata/text.txt | 62 - .../go/doc/comment/testdata/text2.txt | 14 - .../go/doc/comment/testdata/text3.txt | 28 - .../go/doc/comment/testdata/text4.txt | 29 - .../go/doc/comment/testdata/text5.txt | 38 - .../go/doc/comment/testdata/text6.txt | 18 - .../go/doc/comment/testdata/text7.txt | 21 - .../go/doc/comment/testdata/text8.txt | 94 - .../go/doc/comment/testdata/text9.txt | 12 - .../go/doc/comment/testdata/words.txt | 10 - .../backport/go/doc/comment/testdata_test.go | 203 -- internal/backport/go/doc/comment/text.go | 337 -- internal/backport/go/doc/comment/wrap_test.go | 141 - internal/backport/go/doc/comment_test.go | 68 - internal/backport/go/doc/doc.go | 350 -- internal/backport/go/doc/doc_test.go | 297 -- internal/backport/go/doc/example.go | 723 ---- .../backport/go/doc/example_internal_test.go | 121 - internal/backport/go/doc/example_test.go | 344 -- internal/backport/go/doc/exports.go | 324 -- internal/backport/go/doc/filter.go | 106 - internal/backport/go/doc/headscan | Bin 2913680 -> 0 bytes internal/backport/go/doc/headscan.go | 112 - internal/backport/go/doc/reader.go | 1030 ------ internal/backport/go/doc/synopsis.go | 79 - internal/backport/go/doc/synopsis_test.go | 52 - internal/backport/go/doc/testdata/a.0.golden | 52 - internal/backport/go/doc/testdata/a.1.golden | 52 - internal/backport/go/doc/testdata/a.2.golden | 52 - internal/backport/go/doc/testdata/a0.go | 40 - internal/backport/go/doc/testdata/a1.go | 12 - internal/backport/go/doc/testdata/b.0.golden | 74 - internal/backport/go/doc/testdata/b.1.golden | 89 - internal/backport/go/doc/testdata/b.2.golden | 74 - internal/backport/go/doc/testdata/b.go | 64 - .../backport/go/doc/testdata/benchmark.go | 295 -- .../backport/go/doc/testdata/blank.0.golden | 62 - .../backport/go/doc/testdata/blank.1.golden | 83 - .../backport/go/doc/testdata/blank.2.golden | 62 - internal/backport/go/doc/testdata/blank.go | 75 - .../backport/go/doc/testdata/bugpara.0.golden | 20 - .../backport/go/doc/testdata/bugpara.1.golden | 20 - .../backport/go/doc/testdata/bugpara.2.golden | 20 - internal/backport/go/doc/testdata/bugpara.go | 9 - internal/backport/go/doc/testdata/c.0.golden | 48 - internal/backport/go/doc/testdata/c.1.golden | 48 - internal/backport/go/doc/testdata/c.2.golden | 48 - internal/backport/go/doc/testdata/c.go | 62 - internal/backport/go/doc/testdata/d.0.golden | 104 - internal/backport/go/doc/testdata/d.1.golden | 104 - internal/backport/go/doc/testdata/d.2.golden | 104 - internal/backport/go/doc/testdata/d1.go | 57 - internal/backport/go/doc/testdata/d2.go | 45 - internal/backport/go/doc/testdata/e.0.golden | 109 - internal/backport/go/doc/testdata/e.1.golden | 144 - internal/backport/go/doc/testdata/e.2.golden | 130 - internal/backport/go/doc/testdata/e.go | 147 - .../backport/go/doc/testdata/error1.0.golden | 30 - .../backport/go/doc/testdata/error1.1.golden | 32 - .../backport/go/doc/testdata/error1.2.golden | 30 - internal/backport/go/doc/testdata/error1.go | 24 - .../backport/go/doc/testdata/error2.0.golden | 27 - .../backport/go/doc/testdata/error2.1.golden | 37 - .../backport/go/doc/testdata/error2.2.golden | 27 - internal/backport/go/doc/testdata/error2.go | 29 - internal/backport/go/doc/testdata/example.go | 81 - .../go/doc/testdata/examples/README.md | 12 - .../go/doc/testdata/examples/empty.go | 8 - .../go/doc/testdata/examples/empty.golden | 6 - .../testdata/examples/generic_constraints.go | 38 - .../examples/generic_constraints.golden | 39 - .../go/doc/testdata/examples/import_groups.go | 23 - .../testdata/examples/import_groups.golden | 27 - .../testdata/examples/import_groups_named.go | 23 - .../examples/import_groups_named.golden | 27 - .../testdata/examples/inspect_signature.go | 23 - .../examples/inspect_signature.golden | 24 - .../backport/go/doc/testdata/examples/iota.go | 34 - .../go/doc/testdata/examples/iota.golden | 23 - .../go/doc/testdata/examples/issue43658.go | 223 -- .../doc/testdata/examples/issue43658.golden | 156 - .../go/doc/testdata/examples/multiple.go | 98 - .../go/doc/testdata/examples/multiple.golden | 129 - .../go/doc/testdata/examples/values.go | 22 - .../go/doc/testdata/examples/values.golden | 21 - .../go/doc/testdata/examples/whole_file.go | 23 - .../doc/testdata/examples/whole_file.golden | 21 - .../doc/testdata/examples/whole_function.go | 13 - .../testdata/examples/whole_function.golden | 11 - .../examples/whole_function_external.go | 12 - .../examples/whole_function_external.golden | 8 - internal/backport/go/doc/testdata/f.0.golden | 13 - internal/backport/go/doc/testdata/f.1.golden | 16 - internal/backport/go/doc/testdata/f.2.golden | 13 - internal/backport/go/doc/testdata/f.go | 14 - internal/backport/go/doc/testdata/g.0.golden | 32 - internal/backport/go/doc/testdata/g.1.golden | 34 - internal/backport/go/doc/testdata/g.2.golden | 32 - internal/backport/go/doc/testdata/g.go | 25 - .../go/doc/testdata/generics.0.golden | 76 - .../go/doc/testdata/generics.1.golden | 66 - .../go/doc/testdata/generics.2.golden | 76 - internal/backport/go/doc/testdata/generics.go | 74 - .../go/doc/testdata/issue12839.0.golden | 51 - .../go/doc/testdata/issue12839.1.golden | 54 - .../go/doc/testdata/issue12839.2.golden | 51 - .../backport/go/doc/testdata/issue12839.go | 69 - .../go/doc/testdata/issue13742.0.golden | 25 - .../go/doc/testdata/issue13742.1.golden | 25 - .../go/doc/testdata/issue13742.2.golden | 25 - .../backport/go/doc/testdata/issue13742.go | 18 - .../go/doc/testdata/issue16153.0.golden | 32 - .../go/doc/testdata/issue16153.1.golden | 34 - .../go/doc/testdata/issue16153.2.golden | 32 - .../backport/go/doc/testdata/issue16153.go | 27 - .../go/doc/testdata/issue17788.0.golden | 8 - .../go/doc/testdata/issue17788.1.golden | 8 - .../go/doc/testdata/issue17788.2.golden | 8 - .../backport/go/doc/testdata/issue17788.go | 8 - .../go/doc/testdata/issue22856.0.golden | 45 - .../go/doc/testdata/issue22856.1.golden | 45 - .../go/doc/testdata/issue22856.2.golden | 45 - .../backport/go/doc/testdata/issue22856.go | 27 - .../go/doc/testdata/predeclared.0.golden | 8 - .../go/doc/testdata/predeclared.1.golden | 22 - .../go/doc/testdata/predeclared.2.golden | 8 - .../backport/go/doc/testdata/predeclared.go | 22 - .../backport/go/doc/testdata/template.txt | 68 - .../backport/go/doc/testdata/testing.0.golden | 156 - .../backport/go/doc/testdata/testing.1.golden | 298 -- .../backport/go/doc/testdata/testing.2.golden | 156 - internal/backport/go/doc/testdata/testing.go | 404 --- internal/backport/go/format/benchmark_test.go | 91 - internal/backport/go/format/example_test.go | 39 - internal/backport/go/format/format.go | 134 - internal/backport/go/format/format_test.go | 188 -- internal/backport/go/format/internal.go | 176 - .../backport/go/internal/typeparams/common.go | 15 - .../go/internal/typeparams/typeparams.go | 54 - internal/backport/go/parser/error_test.go | 202 -- internal/backport/go/parser/example_test.go | 43 - internal/backport/go/parser/interface.go | 239 -- internal/backport/go/parser/parser.go | 2936 ----------------- internal/backport/go/parser/parser_test.go | 579 ---- .../backport/go/parser/performance_test.go | 57 - internal/backport/go/parser/resolver.go | 607 ---- internal/backport/go/parser/resolver_test.go | 176 - internal/backport/go/parser/short_test.go | 284 -- .../backport/go/parser/testdata/chans.go2 | 62 - .../backport/go/parser/testdata/commas.src | 19 - .../backport/go/parser/testdata/interface.go2 | 76 - .../go/parser/testdata/issue11377.src | 27 - .../go/parser/testdata/issue23434.src | 25 - .../backport/go/parser/testdata/issue3106.src | 46 - .../go/parser/testdata/issue34946.src | 22 - .../issue42951/not_a_file.go/invalid.go | 1 - .../go/parser/testdata/issue44504.src | 13 - .../go/parser/testdata/issue49174.go2 | 8 - .../go/parser/testdata/issue49175.go2 | 13 - .../go/parser/testdata/issue49482.go2 | 34 - .../go/parser/testdata/issue50427.go2 | 19 - .../backport/go/parser/testdata/linalg.go2 | 83 - internal/backport/go/parser/testdata/map.go2 | 109 - .../backport/go/parser/testdata/metrics.go2 | 58 - .../parser/testdata/resolution/issue45136.src | 27 - .../parser/testdata/resolution/issue45160.src | 25 - .../parser/testdata/resolution/resolution.src | 63 - .../parser/testdata/resolution/typeparams.go2 | 51 - internal/backport/go/parser/testdata/set.go2 | 31 - .../backport/go/parser/testdata/slices.go2 | 31 - internal/backport/go/parser/testdata/sort.go2 | 27 - .../backport/go/parser/testdata/tparams.go2 | 47 - .../go/parser/testdata/typeparams.src | 17 - .../backport/go/parser/testdata/typeset.go2 | 72 - internal/backport/go/printer/comment.go | 155 - internal/backport/go/printer/example_test.go | 67 - internal/backport/go/printer/gobuild.go | 170 - internal/backport/go/printer/nodes.go | 1921 ----------- .../backport/go/printer/performance_test.go | 64 - internal/backport/go/printer/printer.go | 1409 -------- internal/backport/go/printer/printer_test.go | 800 ----- .../go/printer/testdata/alignment.golden | 172 - .../go/printer/testdata/alignment.input | 179 - .../go/printer/testdata/comments.golden | 774 ----- .../go/printer/testdata/comments.input | 773 ----- .../backport/go/printer/testdata/comments.x | 55 - .../go/printer/testdata/comments2.golden | 163 - .../go/printer/testdata/comments2.input | 168 - .../go/printer/testdata/complit.input | 65 - .../backport/go/printer/testdata/complit.x | 62 - .../go/printer/testdata/declarations.golden | 1008 ------ .../go/printer/testdata/declarations.input | 1021 ------ .../backport/go/printer/testdata/doc.golden | 21 - .../backport/go/printer/testdata/doc.input | 20 - .../backport/go/printer/testdata/empty.golden | 5 - .../backport/go/printer/testdata/empty.input | 5 - .../go/printer/testdata/expressions.golden | 743 ----- .../go/printer/testdata/expressions.input | 771 ----- .../go/printer/testdata/expressions.raw | 743 ----- .../go/printer/testdata/generics.golden | 109 - .../go/printer/testdata/generics.input | 105 - .../go/printer/testdata/go2numbers.golden | 186 -- .../go/printer/testdata/go2numbers.input | 186 -- .../go/printer/testdata/go2numbers.norm | 186 -- .../go/printer/testdata/gobuild1.golden | 6 - .../go/printer/testdata/gobuild1.input | 7 - .../go/printer/testdata/gobuild2.golden | 8 - .../go/printer/testdata/gobuild2.input | 9 - .../go/printer/testdata/gobuild3.golden | 10 - .../go/printer/testdata/gobuild3.input | 11 - .../go/printer/testdata/gobuild4.golden | 6 - .../go/printer/testdata/gobuild4.input | 5 - .../go/printer/testdata/gobuild5.golden | 4 - .../go/printer/testdata/gobuild5.input | 4 - .../go/printer/testdata/gobuild6.golden | 5 - .../go/printer/testdata/gobuild6.input | 4 - .../go/printer/testdata/gobuild7.golden | 11 - .../go/printer/testdata/gobuild7.input | 11 - .../go/printer/testdata/linebreaks.golden | 295 -- .../go/printer/testdata/linebreaks.input | 291 -- .../backport/go/printer/testdata/parser.go | 2148 ------------ .../backport/go/printer/testdata/slow.golden | 85 - .../backport/go/printer/testdata/slow.input | 85 - .../go/printer/testdata/statements.golden | 644 ---- .../go/printer/testdata/statements.input | 555 ---- internal/backport/go/scanner/errors.go | 120 - internal/backport/go/scanner/example_test.go | 46 - internal/backport/go/scanner/scanner.go | 983 ------ internal/backport/go/scanner/scanner_test.go | 1127 ------- internal/backport/go/token/example_test.go | 77 - internal/backport/go/token/position.go | 529 --- .../backport/go/token/position_bench_test.go | 24 - internal/backport/go/token/position_test.go | 341 -- internal/backport/go/token/serialize.go | 71 - internal/backport/go/token/serialize_test.go | 111 - internal/backport/go/token/token.go | 338 -- internal/backport/go/token/token_test.go | 33 - internal/backport/html/template/attr.go | 175 - .../backport/html/template/attr_string.go | 16 - internal/backport/html/template/clone_test.go | 280 -- internal/backport/html/template/content.go | 187 -- .../backport/html/template/content_test.go | 458 --- internal/backport/html/template/context.go | 267 -- internal/backport/html/template/css.go | 260 -- internal/backport/html/template/css_test.go | 281 -- .../backport/html/template/delim_string.go | 16 - internal/backport/html/template/doc.go | 235 -- .../backport/html/template/element_string.go | 16 - internal/backport/html/template/error.go | 237 -- internal/backport/html/template/escape.go | 968 ------ .../backport/html/template/escape_test.go | 1994 ----------- .../backport/html/template/example_test.go | 182 - .../html/template/examplefiles_test.go | 227 -- internal/backport/html/template/exec_test.go | 1834 ---------- internal/backport/html/template/html.go | 267 -- internal/backport/html/template/html_test.go | 97 - internal/backport/html/template/js.go | 431 --- internal/backport/html/template/js_test.go | 423 --- .../backport/html/template/jsctx_string.go | 16 - internal/backport/html/template/multi_test.go | 277 -- .../backport/html/template/state_string.go | 16 - internal/backport/html/template/template.go | 538 --- .../backport/html/template/template_test.go | 219 -- .../html/template/testdata/file1.tmpl | 2 - .../html/template/testdata/file2.tmpl | 2 - .../backport/html/template/testdata/fs.zip | Bin 406 -> 0 bytes .../html/template/testdata/tmpl1.tmpl | 3 - .../html/template/testdata/tmpl2.tmpl | 3 - internal/backport/html/template/transition.go | 592 ---- .../backport/html/template/transition_test.go | 60 - internal/backport/html/template/url.go | 219 -- internal/backport/html/template/url_test.go | 169 - .../backport/html/template/urlpart_string.go | 16 - internal/backport/text/template/doc.go | 463 --- .../backport/text/template/example_test.go | 111 - .../text/template/examplefiles_test.go | 183 - .../text/template/examplefunc_test.go | 55 - internal/backport/text/template/exec.go | 1028 ------ internal/backport/text/template/exec_test.go | 1782 ---------- internal/backport/text/template/funcs.go | 755 ----- internal/backport/text/template/funcs.go.save | 771 ----- internal/backport/text/template/helper.go | 178 - internal/backport/text/template/multi_test.go | 455 --- internal/backport/text/template/option.go | 74 - internal/backport/text/template/parse/lex.go | 682 ---- .../backport/text/template/parse/lex_test.go | 559 ---- internal/backport/text/template/parse/node.go | 1008 ------ .../backport/text/template/parse/parse.go | 826 ----- .../text/template/parse/parse_test.go | 676 ---- internal/backport/text/template/template.go | 239 -- .../text/template/testdata/file1.tmpl | 2 - .../text/template/testdata/file2.tmpl | 2 - .../text/template/testdata/tmpl1.tmpl | 3 - .../text/template/testdata/tmpl2.tmpl | 3 - internal/codewalk/codewalk.go | 2 +- internal/history/history.go | 3 +- internal/history/release.go | 2 +- internal/pkgdoc/dir.go | 8 +- internal/pkgdoc/dir_test.go | 2 +- internal/pkgdoc/doc.go | 8 +- internal/pkgdoc/funcs.go | 17 +- internal/pkgdoc/go118.go | 19 + .../pkgdoc/doc.go => pkgdoc/go119.go} | 17 +- internal/pkgdoc/html_test.go | 7 +- internal/redirect/redirect.go | 2 +- internal/short/short.go | 2 +- internal/texthtml/ast.go | 6 +- internal/texthtml/texthtml.go | 6 +- internal/tmplfunc/func.go | 7 +- internal/tmplfunc/tmpl.go | 4 +- internal/tmplfunc/tmplfunc_test.go | 4 +- internal/tour/fmt.go | 8 +- internal/web/code.go | 2 +- internal/web/render.go | 2 +- internal/web/site.go | 2 +- internal/web/tmpl.go | 2 +- 413 files changed, 76 insertions(+), 69886 deletions(-) delete mode 100644 internal/backport/README.md delete mode 100644 internal/backport/diff/diff.go delete mode 100644 internal/backport/diff/diff_test.go delete mode 100644 internal/backport/diff/testdata/allnew.txt delete mode 100644 internal/backport/diff/testdata/allold.txt delete mode 100644 internal/backport/diff/testdata/basic.txt delete mode 100644 internal/backport/diff/testdata/dups.txt delete mode 100644 internal/backport/diff/testdata/end.txt delete mode 100644 internal/backport/diff/testdata/eof.txt delete mode 100644 internal/backport/diff/testdata/eof1.txt delete mode 100644 internal/backport/diff/testdata/eof2.txt delete mode 100644 internal/backport/diff/testdata/long.txt delete mode 100644 internal/backport/diff/testdata/same.txt delete mode 100644 internal/backport/diff/testdata/start.txt delete mode 100644 internal/backport/diff/testdata/triv.txt delete mode 100644 internal/backport/fmtsort/sort.go delete mode 100644 internal/backport/go/ast/ast.go delete mode 100644 internal/backport/go/ast/ast_test.go delete mode 100644 internal/backport/go/ast/commentmap.go delete mode 100644 internal/backport/go/ast/commentmap_test.go delete mode 100644 internal/backport/go/ast/example_test.go delete mode 100644 internal/backport/go/ast/filter.go delete mode 100644 internal/backport/go/ast/filter_test.go delete mode 100644 internal/backport/go/ast/import.go delete mode 100644 internal/backport/go/ast/issues_test.go delete mode 100644 internal/backport/go/ast/print.go delete mode 100644 internal/backport/go/ast/print_test.go delete mode 100644 internal/backport/go/ast/resolve.go delete mode 100644 internal/backport/go/ast/scope.go delete mode 100644 internal/backport/go/ast/walk.go delete mode 100644 internal/backport/go/build/build.go delete mode 100644 internal/backport/go/build/doc.go delete mode 100644 internal/backport/go/build/gc.go delete mode 100644 internal/backport/go/build/gccgo.go delete mode 100644 internal/backport/go/build/read.go delete mode 100644 internal/backport/go/build/read_test.go delete mode 100644 internal/backport/go/build/syslist.go delete mode 100644 internal/backport/go/build/syslist_test.go delete mode 100644 internal/backport/go/doc/Makefile delete mode 100644 internal/backport/go/doc/comment.go delete mode 100644 internal/backport/go/doc/comment/doc.go delete mode 100644 internal/backport/go/doc/comment/html.go delete mode 100644 internal/backport/go/doc/comment/markdown.go delete mode 100755 internal/backport/go/doc/comment/mkstd.sh delete mode 100644 internal/backport/go/doc/comment/old_test.go delete mode 100644 internal/backport/go/doc/comment/parse.go delete mode 100644 internal/backport/go/doc/comment/parse_test.go delete mode 100644 internal/backport/go/doc/comment/print.go delete mode 100644 internal/backport/go/doc/comment/std.go delete mode 100644 internal/backport/go/doc/comment/std_test.go delete mode 100644 internal/backport/go/doc/comment/testdata/README.md delete mode 100644 internal/backport/go/doc/comment/testdata/blank.txt delete mode 100644 internal/backport/go/doc/comment/testdata/code.txt delete mode 100644 internal/backport/go/doc/comment/testdata/code2.txt delete mode 100644 internal/backport/go/doc/comment/testdata/code3.txt delete mode 100644 internal/backport/go/doc/comment/testdata/code4.txt delete mode 100644 internal/backport/go/doc/comment/testdata/code5.txt delete mode 100644 internal/backport/go/doc/comment/testdata/code6.txt delete mode 100644 internal/backport/go/doc/comment/testdata/crash1.txt delete mode 100644 internal/backport/go/doc/comment/testdata/doclink.txt delete mode 100644 internal/backport/go/doc/comment/testdata/doclink2.txt delete mode 100644 internal/backport/go/doc/comment/testdata/doclink3.txt delete mode 100644 internal/backport/go/doc/comment/testdata/doclink4.txt delete mode 100644 internal/backport/go/doc/comment/testdata/doclink5.txt delete mode 100644 internal/backport/go/doc/comment/testdata/doclink6.txt delete mode 100644 internal/backport/go/doc/comment/testdata/doclink7.txt delete mode 100644 internal/backport/go/doc/comment/testdata/escape.txt delete mode 100644 internal/backport/go/doc/comment/testdata/head.txt delete mode 100644 internal/backport/go/doc/comment/testdata/head2.txt delete mode 100644 internal/backport/go/doc/comment/testdata/head3.txt delete mode 100644 internal/backport/go/doc/comment/testdata/hello.txt delete mode 100644 internal/backport/go/doc/comment/testdata/link.txt delete mode 100644 internal/backport/go/doc/comment/testdata/link2.txt delete mode 100644 internal/backport/go/doc/comment/testdata/link3.txt delete mode 100644 internal/backport/go/doc/comment/testdata/link4.txt delete mode 100644 internal/backport/go/doc/comment/testdata/link5.txt delete mode 100644 internal/backport/go/doc/comment/testdata/link6.txt delete mode 100644 internal/backport/go/doc/comment/testdata/link7.txt delete mode 100644 internal/backport/go/doc/comment/testdata/linklist.txt delete mode 100644 internal/backport/go/doc/comment/testdata/linklist2.txt delete mode 100644 internal/backport/go/doc/comment/testdata/linklist3.txt delete mode 100644 internal/backport/go/doc/comment/testdata/linklist4.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list10.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list2.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list3.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list4.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list5.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list6.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list7.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list8.txt delete mode 100644 internal/backport/go/doc/comment/testdata/list9.txt delete mode 100644 internal/backport/go/doc/comment/testdata/para.txt delete mode 100644 internal/backport/go/doc/comment/testdata/quote.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text2.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text3.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text4.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text5.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text6.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text7.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text8.txt delete mode 100644 internal/backport/go/doc/comment/testdata/text9.txt delete mode 100644 internal/backport/go/doc/comment/testdata/words.txt delete mode 100644 internal/backport/go/doc/comment/testdata_test.go delete mode 100644 internal/backport/go/doc/comment/text.go delete mode 100644 internal/backport/go/doc/comment/wrap_test.go delete mode 100644 internal/backport/go/doc/comment_test.go delete mode 100644 internal/backport/go/doc/doc.go delete mode 100644 internal/backport/go/doc/doc_test.go delete mode 100644 internal/backport/go/doc/example.go delete mode 100644 internal/backport/go/doc/example_internal_test.go delete mode 100644 internal/backport/go/doc/example_test.go delete mode 100644 internal/backport/go/doc/exports.go delete mode 100644 internal/backport/go/doc/filter.go delete mode 100755 internal/backport/go/doc/headscan delete mode 100644 internal/backport/go/doc/headscan.go delete mode 100644 internal/backport/go/doc/reader.go delete mode 100644 internal/backport/go/doc/synopsis.go delete mode 100644 internal/backport/go/doc/synopsis_test.go delete mode 100644 internal/backport/go/doc/testdata/a.0.golden delete mode 100644 internal/backport/go/doc/testdata/a.1.golden delete mode 100644 internal/backport/go/doc/testdata/a.2.golden delete mode 100644 internal/backport/go/doc/testdata/a0.go delete mode 100644 internal/backport/go/doc/testdata/a1.go delete mode 100644 internal/backport/go/doc/testdata/b.0.golden delete mode 100644 internal/backport/go/doc/testdata/b.1.golden delete mode 100644 internal/backport/go/doc/testdata/b.2.golden delete mode 100644 internal/backport/go/doc/testdata/b.go delete mode 100644 internal/backport/go/doc/testdata/benchmark.go delete mode 100644 internal/backport/go/doc/testdata/blank.0.golden delete mode 100644 internal/backport/go/doc/testdata/blank.1.golden delete mode 100644 internal/backport/go/doc/testdata/blank.2.golden delete mode 100644 internal/backport/go/doc/testdata/blank.go delete mode 100644 internal/backport/go/doc/testdata/bugpara.0.golden delete mode 100644 internal/backport/go/doc/testdata/bugpara.1.golden delete mode 100644 internal/backport/go/doc/testdata/bugpara.2.golden delete mode 100644 internal/backport/go/doc/testdata/bugpara.go delete mode 100644 internal/backport/go/doc/testdata/c.0.golden delete mode 100644 internal/backport/go/doc/testdata/c.1.golden delete mode 100644 internal/backport/go/doc/testdata/c.2.golden delete mode 100644 internal/backport/go/doc/testdata/c.go delete mode 100644 internal/backport/go/doc/testdata/d.0.golden delete mode 100644 internal/backport/go/doc/testdata/d.1.golden delete mode 100644 internal/backport/go/doc/testdata/d.2.golden delete mode 100644 internal/backport/go/doc/testdata/d1.go delete mode 100644 internal/backport/go/doc/testdata/d2.go delete mode 100644 internal/backport/go/doc/testdata/e.0.golden delete mode 100644 internal/backport/go/doc/testdata/e.1.golden delete mode 100644 internal/backport/go/doc/testdata/e.2.golden delete mode 100644 internal/backport/go/doc/testdata/e.go delete mode 100644 internal/backport/go/doc/testdata/error1.0.golden delete mode 100644 internal/backport/go/doc/testdata/error1.1.golden delete mode 100644 internal/backport/go/doc/testdata/error1.2.golden delete mode 100644 internal/backport/go/doc/testdata/error1.go delete mode 100644 internal/backport/go/doc/testdata/error2.0.golden delete mode 100644 internal/backport/go/doc/testdata/error2.1.golden delete mode 100644 internal/backport/go/doc/testdata/error2.2.golden delete mode 100644 internal/backport/go/doc/testdata/error2.go delete mode 100644 internal/backport/go/doc/testdata/example.go delete mode 100644 internal/backport/go/doc/testdata/examples/README.md delete mode 100644 internal/backport/go/doc/testdata/examples/empty.go delete mode 100644 internal/backport/go/doc/testdata/examples/empty.golden delete mode 100644 internal/backport/go/doc/testdata/examples/generic_constraints.go delete mode 100644 internal/backport/go/doc/testdata/examples/generic_constraints.golden delete mode 100644 internal/backport/go/doc/testdata/examples/import_groups.go delete mode 100644 internal/backport/go/doc/testdata/examples/import_groups.golden delete mode 100644 internal/backport/go/doc/testdata/examples/import_groups_named.go delete mode 100644 internal/backport/go/doc/testdata/examples/import_groups_named.golden delete mode 100644 internal/backport/go/doc/testdata/examples/inspect_signature.go delete mode 100644 internal/backport/go/doc/testdata/examples/inspect_signature.golden delete mode 100644 internal/backport/go/doc/testdata/examples/iota.go delete mode 100644 internal/backport/go/doc/testdata/examples/iota.golden delete mode 100644 internal/backport/go/doc/testdata/examples/issue43658.go delete mode 100644 internal/backport/go/doc/testdata/examples/issue43658.golden delete mode 100644 internal/backport/go/doc/testdata/examples/multiple.go delete mode 100644 internal/backport/go/doc/testdata/examples/multiple.golden delete mode 100644 internal/backport/go/doc/testdata/examples/values.go delete mode 100644 internal/backport/go/doc/testdata/examples/values.golden delete mode 100644 internal/backport/go/doc/testdata/examples/whole_file.go delete mode 100644 internal/backport/go/doc/testdata/examples/whole_file.golden delete mode 100644 internal/backport/go/doc/testdata/examples/whole_function.go delete mode 100644 internal/backport/go/doc/testdata/examples/whole_function.golden delete mode 100644 internal/backport/go/doc/testdata/examples/whole_function_external.go delete mode 100644 internal/backport/go/doc/testdata/examples/whole_function_external.golden delete mode 100644 internal/backport/go/doc/testdata/f.0.golden delete mode 100644 internal/backport/go/doc/testdata/f.1.golden delete mode 100644 internal/backport/go/doc/testdata/f.2.golden delete mode 100644 internal/backport/go/doc/testdata/f.go delete mode 100644 internal/backport/go/doc/testdata/g.0.golden delete mode 100644 internal/backport/go/doc/testdata/g.1.golden delete mode 100644 internal/backport/go/doc/testdata/g.2.golden delete mode 100644 internal/backport/go/doc/testdata/g.go delete mode 100644 internal/backport/go/doc/testdata/generics.0.golden delete mode 100644 internal/backport/go/doc/testdata/generics.1.golden delete mode 100644 internal/backport/go/doc/testdata/generics.2.golden delete mode 100644 internal/backport/go/doc/testdata/generics.go delete mode 100644 internal/backport/go/doc/testdata/issue12839.0.golden delete mode 100644 internal/backport/go/doc/testdata/issue12839.1.golden delete mode 100644 internal/backport/go/doc/testdata/issue12839.2.golden delete mode 100644 internal/backport/go/doc/testdata/issue12839.go delete mode 100644 internal/backport/go/doc/testdata/issue13742.0.golden delete mode 100644 internal/backport/go/doc/testdata/issue13742.1.golden delete mode 100644 internal/backport/go/doc/testdata/issue13742.2.golden delete mode 100644 internal/backport/go/doc/testdata/issue13742.go delete mode 100644 internal/backport/go/doc/testdata/issue16153.0.golden delete mode 100644 internal/backport/go/doc/testdata/issue16153.1.golden delete mode 100644 internal/backport/go/doc/testdata/issue16153.2.golden delete mode 100644 internal/backport/go/doc/testdata/issue16153.go delete mode 100644 internal/backport/go/doc/testdata/issue17788.0.golden delete mode 100644 internal/backport/go/doc/testdata/issue17788.1.golden delete mode 100644 internal/backport/go/doc/testdata/issue17788.2.golden delete mode 100644 internal/backport/go/doc/testdata/issue17788.go delete mode 100644 internal/backport/go/doc/testdata/issue22856.0.golden delete mode 100644 internal/backport/go/doc/testdata/issue22856.1.golden delete mode 100644 internal/backport/go/doc/testdata/issue22856.2.golden delete mode 100644 internal/backport/go/doc/testdata/issue22856.go delete mode 100644 internal/backport/go/doc/testdata/predeclared.0.golden delete mode 100644 internal/backport/go/doc/testdata/predeclared.1.golden delete mode 100644 internal/backport/go/doc/testdata/predeclared.2.golden delete mode 100644 internal/backport/go/doc/testdata/predeclared.go delete mode 100644 internal/backport/go/doc/testdata/template.txt delete mode 100644 internal/backport/go/doc/testdata/testing.0.golden delete mode 100644 internal/backport/go/doc/testdata/testing.1.golden delete mode 100644 internal/backport/go/doc/testdata/testing.2.golden delete mode 100644 internal/backport/go/doc/testdata/testing.go delete mode 100644 internal/backport/go/format/benchmark_test.go delete mode 100644 internal/backport/go/format/example_test.go delete mode 100644 internal/backport/go/format/format.go delete mode 100644 internal/backport/go/format/format_test.go delete mode 100644 internal/backport/go/format/internal.go delete mode 100644 internal/backport/go/internal/typeparams/common.go delete mode 100644 internal/backport/go/internal/typeparams/typeparams.go delete mode 100644 internal/backport/go/parser/error_test.go delete mode 100644 internal/backport/go/parser/example_test.go delete mode 100644 internal/backport/go/parser/interface.go delete mode 100644 internal/backport/go/parser/parser.go delete mode 100644 internal/backport/go/parser/parser_test.go delete mode 100644 internal/backport/go/parser/performance_test.go delete mode 100644 internal/backport/go/parser/resolver.go delete mode 100644 internal/backport/go/parser/resolver_test.go delete mode 100644 internal/backport/go/parser/short_test.go delete mode 100644 internal/backport/go/parser/testdata/chans.go2 delete mode 100644 internal/backport/go/parser/testdata/commas.src delete mode 100644 internal/backport/go/parser/testdata/interface.go2 delete mode 100644 internal/backport/go/parser/testdata/issue11377.src delete mode 100644 internal/backport/go/parser/testdata/issue23434.src delete mode 100644 internal/backport/go/parser/testdata/issue3106.src delete mode 100644 internal/backport/go/parser/testdata/issue34946.src delete mode 100644 internal/backport/go/parser/testdata/issue42951/not_a_file.go/invalid.go delete mode 100644 internal/backport/go/parser/testdata/issue44504.src delete mode 100644 internal/backport/go/parser/testdata/issue49174.go2 delete mode 100644 internal/backport/go/parser/testdata/issue49175.go2 delete mode 100644 internal/backport/go/parser/testdata/issue49482.go2 delete mode 100644 internal/backport/go/parser/testdata/issue50427.go2 delete mode 100644 internal/backport/go/parser/testdata/linalg.go2 delete mode 100644 internal/backport/go/parser/testdata/map.go2 delete mode 100644 internal/backport/go/parser/testdata/metrics.go2 delete mode 100644 internal/backport/go/parser/testdata/resolution/issue45136.src delete mode 100644 internal/backport/go/parser/testdata/resolution/issue45160.src delete mode 100644 internal/backport/go/parser/testdata/resolution/resolution.src delete mode 100644 internal/backport/go/parser/testdata/resolution/typeparams.go2 delete mode 100644 internal/backport/go/parser/testdata/set.go2 delete mode 100644 internal/backport/go/parser/testdata/slices.go2 delete mode 100644 internal/backport/go/parser/testdata/sort.go2 delete mode 100644 internal/backport/go/parser/testdata/tparams.go2 delete mode 100644 internal/backport/go/parser/testdata/typeparams.src delete mode 100644 internal/backport/go/parser/testdata/typeset.go2 delete mode 100644 internal/backport/go/printer/comment.go delete mode 100644 internal/backport/go/printer/example_test.go delete mode 100644 internal/backport/go/printer/gobuild.go delete mode 100644 internal/backport/go/printer/nodes.go delete mode 100644 internal/backport/go/printer/performance_test.go delete mode 100644 internal/backport/go/printer/printer.go delete mode 100644 internal/backport/go/printer/printer_test.go delete mode 100644 internal/backport/go/printer/testdata/alignment.golden delete mode 100644 internal/backport/go/printer/testdata/alignment.input delete mode 100644 internal/backport/go/printer/testdata/comments.golden delete mode 100644 internal/backport/go/printer/testdata/comments.input delete mode 100644 internal/backport/go/printer/testdata/comments.x delete mode 100644 internal/backport/go/printer/testdata/comments2.golden delete mode 100644 internal/backport/go/printer/testdata/comments2.input delete mode 100644 internal/backport/go/printer/testdata/complit.input delete mode 100644 internal/backport/go/printer/testdata/complit.x delete mode 100644 internal/backport/go/printer/testdata/declarations.golden delete mode 100644 internal/backport/go/printer/testdata/declarations.input delete mode 100644 internal/backport/go/printer/testdata/doc.golden delete mode 100644 internal/backport/go/printer/testdata/doc.input delete mode 100644 internal/backport/go/printer/testdata/empty.golden delete mode 100644 internal/backport/go/printer/testdata/empty.input delete mode 100644 internal/backport/go/printer/testdata/expressions.golden delete mode 100644 internal/backport/go/printer/testdata/expressions.input delete mode 100644 internal/backport/go/printer/testdata/expressions.raw delete mode 100644 internal/backport/go/printer/testdata/generics.golden delete mode 100644 internal/backport/go/printer/testdata/generics.input delete mode 100644 internal/backport/go/printer/testdata/go2numbers.golden delete mode 100644 internal/backport/go/printer/testdata/go2numbers.input delete mode 100644 internal/backport/go/printer/testdata/go2numbers.norm delete mode 100644 internal/backport/go/printer/testdata/gobuild1.golden delete mode 100644 internal/backport/go/printer/testdata/gobuild1.input delete mode 100644 internal/backport/go/printer/testdata/gobuild2.golden delete mode 100644 internal/backport/go/printer/testdata/gobuild2.input delete mode 100644 internal/backport/go/printer/testdata/gobuild3.golden delete mode 100644 internal/backport/go/printer/testdata/gobuild3.input delete mode 100644 internal/backport/go/printer/testdata/gobuild4.golden delete mode 100644 internal/backport/go/printer/testdata/gobuild4.input delete mode 100644 internal/backport/go/printer/testdata/gobuild5.golden delete mode 100644 internal/backport/go/printer/testdata/gobuild5.input delete mode 100644 internal/backport/go/printer/testdata/gobuild6.golden delete mode 100644 internal/backport/go/printer/testdata/gobuild6.input delete mode 100644 internal/backport/go/printer/testdata/gobuild7.golden delete mode 100644 internal/backport/go/printer/testdata/gobuild7.input delete mode 100644 internal/backport/go/printer/testdata/linebreaks.golden delete mode 100644 internal/backport/go/printer/testdata/linebreaks.input delete mode 100644 internal/backport/go/printer/testdata/parser.go delete mode 100644 internal/backport/go/printer/testdata/slow.golden delete mode 100644 internal/backport/go/printer/testdata/slow.input delete mode 100644 internal/backport/go/printer/testdata/statements.golden delete mode 100644 internal/backport/go/printer/testdata/statements.input delete mode 100644 internal/backport/go/scanner/errors.go delete mode 100644 internal/backport/go/scanner/example_test.go delete mode 100644 internal/backport/go/scanner/scanner.go delete mode 100644 internal/backport/go/scanner/scanner_test.go delete mode 100644 internal/backport/go/token/example_test.go delete mode 100644 internal/backport/go/token/position.go delete mode 100644 internal/backport/go/token/position_bench_test.go delete mode 100644 internal/backport/go/token/position_test.go delete mode 100644 internal/backport/go/token/serialize.go delete mode 100644 internal/backport/go/token/serialize_test.go delete mode 100644 internal/backport/go/token/token.go delete mode 100644 internal/backport/go/token/token_test.go delete mode 100644 internal/backport/html/template/attr.go delete mode 100644 internal/backport/html/template/attr_string.go delete mode 100644 internal/backport/html/template/clone_test.go delete mode 100644 internal/backport/html/template/content.go delete mode 100644 internal/backport/html/template/content_test.go delete mode 100644 internal/backport/html/template/context.go delete mode 100644 internal/backport/html/template/css.go delete mode 100644 internal/backport/html/template/css_test.go delete mode 100644 internal/backport/html/template/delim_string.go delete mode 100644 internal/backport/html/template/doc.go delete mode 100644 internal/backport/html/template/element_string.go delete mode 100644 internal/backport/html/template/error.go delete mode 100644 internal/backport/html/template/escape.go delete mode 100644 internal/backport/html/template/escape_test.go delete mode 100644 internal/backport/html/template/example_test.go delete mode 100644 internal/backport/html/template/examplefiles_test.go delete mode 100644 internal/backport/html/template/exec_test.go delete mode 100644 internal/backport/html/template/html.go delete mode 100644 internal/backport/html/template/html_test.go delete mode 100644 internal/backport/html/template/js.go delete mode 100644 internal/backport/html/template/js_test.go delete mode 100644 internal/backport/html/template/jsctx_string.go delete mode 100644 internal/backport/html/template/multi_test.go delete mode 100644 internal/backport/html/template/state_string.go delete mode 100644 internal/backport/html/template/template.go delete mode 100644 internal/backport/html/template/template_test.go delete mode 100644 internal/backport/html/template/testdata/file1.tmpl delete mode 100644 internal/backport/html/template/testdata/file2.tmpl delete mode 100644 internal/backport/html/template/testdata/fs.zip delete mode 100644 internal/backport/html/template/testdata/tmpl1.tmpl delete mode 100644 internal/backport/html/template/testdata/tmpl2.tmpl delete mode 100644 internal/backport/html/template/transition.go delete mode 100644 internal/backport/html/template/transition_test.go delete mode 100644 internal/backport/html/template/url.go delete mode 100644 internal/backport/html/template/url_test.go delete mode 100644 internal/backport/html/template/urlpart_string.go delete mode 100644 internal/backport/text/template/doc.go delete mode 100644 internal/backport/text/template/example_test.go delete mode 100644 internal/backport/text/template/examplefiles_test.go delete mode 100644 internal/backport/text/template/examplefunc_test.go delete mode 100644 internal/backport/text/template/exec.go delete mode 100644 internal/backport/text/template/exec_test.go delete mode 100644 internal/backport/text/template/funcs.go delete mode 100644 internal/backport/text/template/funcs.go.save delete mode 100644 internal/backport/text/template/helper.go delete mode 100644 internal/backport/text/template/multi_test.go delete mode 100644 internal/backport/text/template/option.go delete mode 100644 internal/backport/text/template/parse/lex.go delete mode 100644 internal/backport/text/template/parse/lex_test.go delete mode 100644 internal/backport/text/template/parse/node.go delete mode 100644 internal/backport/text/template/parse/parse.go delete mode 100644 internal/backport/text/template/parse/parse_test.go delete mode 100644 internal/backport/text/template/template.go delete mode 100644 internal/backport/text/template/testdata/file1.tmpl delete mode 100644 internal/backport/text/template/testdata/file2.tmpl delete mode 100644 internal/backport/text/template/testdata/tmpl1.tmpl delete mode 100644 internal/backport/text/template/testdata/tmpl2.tmpl create mode 100644 internal/pkgdoc/go118.go rename internal/{backport/go/doc/testdata/pkgdoc/doc.go => pkgdoc/go119.go} (59%) diff --git a/cmd/golangorg/server.go b/cmd/golangorg/server.go index 88c8d32a1b..239831a73a 100644 --- a/cmd/golangorg/server.go +++ b/cmd/golangorg/server.go @@ -14,6 +14,8 @@ import ( "errors" "flag" "fmt" + "go/format" + "html/template" "io/fs" "io/ioutil" "log" @@ -31,8 +33,6 @@ import ( "cloud.google.com/go/datastore" "golang.org/x/build/repos" "golang.org/x/website" - "golang.org/x/website/internal/backport/go/format" - "golang.org/x/website/internal/backport/html/template" "golang.org/x/website/internal/blog" "golang.org/x/website/internal/codewalk" "golang.org/x/website/internal/dl" diff --git a/cmd/googlegolangorg/main.go b/cmd/googlegolangorg/main.go index d53d1ee8b9..e143a43ffc 100644 --- a/cmd/googlegolangorg/main.go +++ b/cmd/googlegolangorg/main.go @@ -3,11 +3,10 @@ package main import ( "fmt" + "html/template" "net/http" "os" "strings" - - "golang.org/x/website/internal/backport/html/template" ) var repoMap = map[string]*repoImport{ diff --git a/internal/api/api_test.go b/internal/api/api_test.go index 79286278a0..98b1dd47e6 100644 --- a/internal/api/api_test.go +++ b/internal/api/api_test.go @@ -5,11 +5,10 @@ package api import ( + "go/build" "os" "runtime" "testing" - - "golang.org/x/website/internal/backport/go/build" ) func TestParseVersionRow(t *testing.T) { diff --git a/internal/backport/README.md b/internal/backport/README.md deleted file mode 100644 index 92c80ad95f..0000000000 --- a/internal/backport/README.md +++ /dev/null @@ -1,10 +0,0 @@ -This directory contains backports of upcoming packages from the -standard library, beyond the Go version supplied by the latest Google -App Engine. - -The procedure for adding a backport is fairly manual: copy the files -to a new directory and then global search and replace to modify import -paths to point to the backport. - -As new versions of Go land on Google App Engine, this directory should -be pruned as much as possible. diff --git a/internal/backport/diff/diff.go b/internal/backport/diff/diff.go deleted file mode 100644 index 47b2856714..0000000000 --- a/internal/backport/diff/diff.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package diff - -import ( - "bytes" - "fmt" - "sort" - "strings" -) - -// A pair is a pair of values tracked for both the x and y side of a diff. -// It is typically a pair of line indexes. -type pair struct{ x, y int } - -// Diff returns an anchored diff of the two texts old and new -// in the “unified diff” format. If old and new are identical, -// Diff returns a nil slice (no output). -// -// Unix diff implementations typically look for a diff with -// the smallest number of lines inserted and removed, -// which can in the worst case take time quadratic in the -// number of lines in the texts. As a result, many implementations -// either can be made to run for a long time or cut off the search -// after a predetermined amount of work. -// -// In contrast, this implementation looks for a diff with the -// smallest number of “unique” lines inserted and removed, -// where unique means a line that appears just once in both old and new. -// We call this an “anchored diff” because the unique lines anchor -// the chosen matching regions. An anchored diff is usually clearer -// than a standard diff, because the algorithm does not try to -// reuse unrelated blank lines or closing braces. -// The algorithm also guarantees to run in O(n log n) time -// instead of the standard O(n²) time. -// -// Some systems call this approach a “patience diff,” named for -// the “patience sorting” algorithm, itself named for a solitaire card game. -// We avoid that name for two reasons. First, the name has been used -// for a few different variants of the algorithm, so it is imprecise. -// Second, the name is frequently interpreted as meaning that you have -// to wait longer (to be patient) for the diff, meaning that it is a slower algorithm, -// when in fact the algorithm is faster than the standard one. -func Diff(oldName string, old []byte, newName string, new []byte) []byte { - if bytes.Equal(old, new) { - return nil - } - x := lines(old) - y := lines(new) - - // Print diff header. - var out bytes.Buffer - fmt.Fprintf(&out, "diff %s %s\n", oldName, newName) - fmt.Fprintf(&out, "--- %s\n", oldName) - fmt.Fprintf(&out, "+++ %s\n", newName) - - // Loop over matches to consider, - // expanding each match to include surrounding lines, - // and then printing diff chunks. - // To avoid setup/teardown cases outside the loop, - // tgs returns a leading {0,0} and trailing {len(x), len(y)} pair - // in the sequence of matches. - var ( - done pair // printed up to x[:done.x] and y[:done.y] - chunk pair // start lines of current chunk - count pair // number of lines from each side in current chunk - ctext []string // lines for current chunk - ) - for _, m := range tgs(x, y) { - if m.x < done.x { - // Already handled scanning forward from earlier match. - continue - } - - // Expand matching lines as far possible, - // establishing that x[start.x:end.x] == y[start.y:end.y]. - // Note that on the first (or last) iteration we may (or definitey do) - // have an empty match: start.x==end.x and start.y==end.y. - start := m - for start.x > done.x && start.y > done.y && x[start.x-1] == y[start.y-1] { - start.x-- - start.y-- - } - end := m - for end.x < len(x) && end.y < len(y) && x[end.x] == y[end.y] { - end.x++ - end.y++ - } - - // Emit the mismatched lines before start into this chunk. - // (No effect on first sentinel iteration, when start = {0,0}.) - for _, s := range x[done.x:start.x] { - ctext = append(ctext, "-"+s) - count.x++ - } - for _, s := range y[done.y:start.y] { - ctext = append(ctext, "+"+s) - count.y++ - } - - // If we're not at EOF and have too few common lines, - // the chunk includes all the common lines and continues. - const C = 3 // number of context lines - if (end.x < len(x) || end.y < len(y)) && - (end.x-start.x < C || (len(ctext) > 0 && end.x-start.x < 2*C)) { - for _, s := range x[start.x:end.x] { - ctext = append(ctext, " "+s) - count.x++ - count.y++ - } - done = end - continue - } - - // End chunk with common lines for context. - if len(ctext) > 0 { - n := end.x - start.x - if n > C { - n = C - } - for _, s := range x[start.x : start.x+n] { - ctext = append(ctext, " "+s) - count.x++ - count.y++ - } - done = pair{start.x + n, start.y + n} - - // Format and emit chunk. - // Convert line numbers to 1-indexed. - // Special case: empty file shows up as 0,0 not 1,0. - if count.x > 0 { - chunk.x++ - } - if count.y > 0 { - chunk.y++ - } - fmt.Fprintf(&out, "@@ -%d,%d +%d,%d @@\n", chunk.x, count.x, chunk.y, count.y) - for _, s := range ctext { - out.WriteString(s) - } - count.x = 0 - count.y = 0 - ctext = ctext[:0] - } - - // If we reached EOF, we're done. - if end.x >= len(x) && end.y >= len(y) { - break - } - - // Otherwise start a new chunk. - chunk = pair{end.x - C, end.y - C} - for _, s := range x[chunk.x:end.x] { - ctext = append(ctext, " "+s) - count.x++ - count.y++ - } - done = end - } - - return out.Bytes() -} - -// lines returns the lines in the file x, including newlines. -// If the file does not end in a newline, one is supplied -// along with a warning about the missing newline. -func lines(x []byte) []string { - l := strings.SplitAfter(string(x), "\n") - if l[len(l)-1] == "" { - l = l[:len(l)-1] - } else { - // Treat last line as having a message about the missing newline attached, - // using the same text as BSD/GNU diff (including the leading backslash). - l[len(l)-1] += "\n\\ No newline at end of file\n" - } - return l -} - -// tgs returns the pairs of indexes of the longest common subsequence -// of unique lines in x and y, where a unique line is one that appears -// once in x and once in y. -// -// The longest common subsequence algorithm is as described in -// Thomas G. Szymanski, “A Special Case of the Maximal Common -// Subsequence Problem,” Princeton TR #170 (January 1975), -// available at https://research.swtch.com/tgs170.pdf. -func tgs(x, y []string) []pair { - // Count the number of times each string appears in a and b. - // We only care about 0, 1, many, counted as 0, -1, -2 - // for the x side and 0, -4, -8 for the y side. - // Using negative numbers now lets us distinguish positive line numbers later. - m := make(map[string]int) - for _, s := range x { - if c := m[s]; c > -2 { - m[s] = c - 1 - } - } - for _, s := range y { - if c := m[s]; c > -8 { - m[s] = c - 4 - } - } - - // Now unique strings can be identified by m[s] = -1+-4. - // - // Gather the indexes of those strings in x and y, building: - // xi[i] = increasing indexes of unique strings in x. - // yi[i] = increasing indexes of unique strings in y. - // inv[i] = index j such that x[xi[i]] = y[yi[j]]. - var xi, yi, inv []int - for i, s := range y { - if m[s] == -1+-4 { - m[s] = len(yi) - yi = append(yi, i) - } - } - for i, s := range x { - if j, ok := m[s]; ok && j >= 0 { - xi = append(xi, i) - inv = append(inv, j) - } - } - - // Apply Algorithm A from Szymanski's paper. - // In those terms, A = J = inv and B = [0, n). - // We add sentinel pairs {0,0}, and {len(x),len(y)} - // to the returned sequence, to help the processing loop. - J := inv - n := len(xi) - T := make([]int, n) - L := make([]int, n) - for i := range T { - T[i] = n + 1 - } - for i := 0; i < n; i++ { - k := sort.Search(n, func(k int) bool { - return T[k] >= J[i] - }) - T[k] = J[i] - L[i] = k + 1 - } - k := 0 - for _, v := range L { - if k < v { - k = v - } - } - seq := make([]pair, 2+k) - seq[1+k] = pair{len(x), len(y)} // sentinel at end - lastj := n - for i := n - 1; i >= 0; i-- { - if L[i] == k && J[i] < lastj { - seq[k] = pair{xi[i], yi[J[i]]} - k-- - } - } - seq[0] = pair{0, 0} // sentinel at start - return seq -} diff --git a/internal/backport/diff/diff_test.go b/internal/backport/diff/diff_test.go deleted file mode 100644 index ee15b0089c..0000000000 --- a/internal/backport/diff/diff_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package diff - -import ( - "bytes" - "path/filepath" - "testing" - - "golang.org/x/tools/txtar" -) - -func clean(text []byte) []byte { - text = bytes.ReplaceAll(text, []byte("$\n"), []byte("\n")) - text = bytes.TrimSuffix(text, []byte("^D\n")) - return text -} - -func Test(t *testing.T) { - files, _ := filepath.Glob("testdata/*.txt") - if len(files) == 0 { - t.Fatalf("no testdata") - } - - for _, file := range files { - t.Run(filepath.Base(file), func(t *testing.T) { - a, err := txtar.ParseFile(file) - if err != nil { - t.Fatal(err) - } - if len(a.Files) != 3 || a.Files[2].Name != "diff" { - t.Fatalf("%s: want three files, third named \"diff\"", file) - } - diffs := Diff(a.Files[0].Name, clean(a.Files[0].Data), a.Files[1].Name, clean(a.Files[1].Data)) - want := clean(a.Files[2].Data) - if !bytes.Equal(diffs, want) { - t.Fatalf("%s: have:\n%s\nwant:\n%s\n%s", file, - diffs, want, Diff("have", diffs, "want", want)) - } - }) - } -} diff --git a/internal/backport/diff/testdata/allnew.txt b/internal/backport/diff/testdata/allnew.txt deleted file mode 100644 index 887564927a..0000000000 --- a/internal/backport/diff/testdata/allnew.txt +++ /dev/null @@ -1,13 +0,0 @@ --- old -- --- new -- -a -b -c --- diff -- -diff old new ---- old -+++ new -@@ -0,0 +1,3 @@ -+a -+b -+c diff --git a/internal/backport/diff/testdata/allold.txt b/internal/backport/diff/testdata/allold.txt deleted file mode 100644 index bcc9ac0ee0..0000000000 --- a/internal/backport/diff/testdata/allold.txt +++ /dev/null @@ -1,13 +0,0 @@ --- old -- -a -b -c --- new -- --- diff -- -diff old new ---- old -+++ new -@@ -1,3 +0,0 @@ --a --b --c diff --git a/internal/backport/diff/testdata/basic.txt b/internal/backport/diff/testdata/basic.txt deleted file mode 100644 index d2565b5d6e..0000000000 --- a/internal/backport/diff/testdata/basic.txt +++ /dev/null @@ -1,35 +0,0 @@ -Example from Hunt and McIlroy, “An Algorithm for Differential File Comparison.” -https://www.cs.dartmouth.edu/~doug/diff.pdf - --- old -- -a -b -c -d -e -f -g --- new -- -w -a -b -x -y -z -e --- diff -- -diff old new ---- old -+++ new -@@ -1,7 +1,7 @@ -+w - a - b --c --d -+x -+y -+z - e --f --g diff --git a/internal/backport/diff/testdata/dups.txt b/internal/backport/diff/testdata/dups.txt deleted file mode 100644 index d10524d0d8..0000000000 --- a/internal/backport/diff/testdata/dups.txt +++ /dev/null @@ -1,40 +0,0 @@ --- old -- -a - -b - -c - -d - -e - -f --- new -- -a - -B - -C - -d - -e - -f --- diff -- -diff old new ---- old -+++ new -@@ -1,8 +1,8 @@ - a - $ --b -- --c -+B -+ -+C - $ - d - $ diff --git a/internal/backport/diff/testdata/end.txt b/internal/backport/diff/testdata/end.txt deleted file mode 100644 index 158637c135..0000000000 --- a/internal/backport/diff/testdata/end.txt +++ /dev/null @@ -1,38 +0,0 @@ --- old -- -1 -2 -3 -4 -5 -6 -7 -eight -nine -ten -eleven --- new -- -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 --- diff -- -diff old new ---- old -+++ new -@@ -5,7 +5,6 @@ - 5 - 6 - 7 --eight --nine --ten --eleven -+8 -+9 -+10 diff --git a/internal/backport/diff/testdata/eof.txt b/internal/backport/diff/testdata/eof.txt deleted file mode 100644 index 5dc145c4de..0000000000 --- a/internal/backport/diff/testdata/eof.txt +++ /dev/null @@ -1,9 +0,0 @@ --- old -- -a -b -c^D --- new -- -a -b -c^D --- diff -- diff --git a/internal/backport/diff/testdata/eof1.txt b/internal/backport/diff/testdata/eof1.txt deleted file mode 100644 index 1ebf621e92..0000000000 --- a/internal/backport/diff/testdata/eof1.txt +++ /dev/null @@ -1,18 +0,0 @@ --- old -- -a -b -c --- new -- -a -b -c^D --- diff -- -diff old new ---- old -+++ new -@@ -1,3 +1,3 @@ - a - b --c -+c -\ No newline at end of file diff --git a/internal/backport/diff/testdata/eof2.txt b/internal/backport/diff/testdata/eof2.txt deleted file mode 100644 index 047705e686..0000000000 --- a/internal/backport/diff/testdata/eof2.txt +++ /dev/null @@ -1,18 +0,0 @@ --- old -- -a -b -c^D --- new -- -a -b -c --- diff -- -diff old new ---- old -+++ new -@@ -1,3 +1,3 @@ - a - b --c -\ No newline at end of file -+c diff --git a/internal/backport/diff/testdata/long.txt b/internal/backport/diff/testdata/long.txt deleted file mode 100644 index 3fc99f71d5..0000000000 --- a/internal/backport/diff/testdata/long.txt +++ /dev/null @@ -1,62 +0,0 @@ --- old -- -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -14½ -15 -16 -17 -18 -19 -20 --- new -- -1 -2 -3 -4 -5 -6 -8 -9 -10 -11 -12 -13 -14 -17 -18 -19 -20 --- diff -- -diff old new ---- old -+++ new -@@ -4,7 +4,6 @@ - 4 - 5 - 6 --7 - 8 - 9 - 10 -@@ -12,9 +11,6 @@ - 12 - 13 - 14 --14½ --15 --16 - 17 - 18 - 19 diff --git a/internal/backport/diff/testdata/same.txt b/internal/backport/diff/testdata/same.txt deleted file mode 100644 index 86b1100d81..0000000000 --- a/internal/backport/diff/testdata/same.txt +++ /dev/null @@ -1,5 +0,0 @@ --- old -- -hello world --- new -- -hello world --- diff -- diff --git a/internal/backport/diff/testdata/start.txt b/internal/backport/diff/testdata/start.txt deleted file mode 100644 index 217b2fdc9f..0000000000 --- a/internal/backport/diff/testdata/start.txt +++ /dev/null @@ -1,34 +0,0 @@ --- old -- -e -pi -4 -5 -6 -7 -8 -9 -10 --- new -- -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 --- diff -- -diff old new ---- old -+++ new -@@ -1,5 +1,6 @@ --e --pi -+1 -+2 -+3 - 4 - 5 - 6 diff --git a/internal/backport/diff/testdata/triv.txt b/internal/backport/diff/testdata/triv.txt deleted file mode 100644 index ab5759fcb2..0000000000 --- a/internal/backport/diff/testdata/triv.txt +++ /dev/null @@ -1,40 +0,0 @@ -Another example from Hunt and McIlroy, -“An Algorithm for Differential File Comparison.” -https://www.cs.dartmouth.edu/~doug/diff.pdf - -Anchored diff gives up on finding anything, -since there are no unique lines. - --- old -- -a -b -c -a -b -b -a --- new -- -c -a -b -a -b -c --- diff -- -diff old new ---- old -+++ new -@@ -1,7 +1,6 @@ --a --b --c --a --b --b --a -+c -+a -+b -+a -+b -+c diff --git a/internal/backport/fmtsort/sort.go b/internal/backport/fmtsort/sort.go deleted file mode 100644 index e0585dc298..0000000000 --- a/internal/backport/fmtsort/sort.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package fmtsort provides a general stable ordering mechanism -// for maps, on behalf of the fmt and text/template packages. -// It is not guaranteed to be efficient and works only for types -// that are valid map keys. -package fmtsort - -import ( - "reflect" - "sort" -) - -// Note: Throughout this package we avoid calling reflect.Value.Interface as -// it is not always legal to do so and it's easier to avoid the issue than to face it. - -// SortedMap represents a map's keys and values. The keys and values are -// aligned in index order: Value[i] is the value in the map corresponding to Key[i]. -type SortedMap struct { - Key []reflect.Value - Value []reflect.Value -} - -func (o *SortedMap) Len() int { return len(o.Key) } -func (o *SortedMap) Less(i, j int) bool { return compare(o.Key[i], o.Key[j]) < 0 } -func (o *SortedMap) Swap(i, j int) { - o.Key[i], o.Key[j] = o.Key[j], o.Key[i] - o.Value[i], o.Value[j] = o.Value[j], o.Value[i] -} - -// Sort accepts a map and returns a SortedMap that has the same keys and -// values but in a stable sorted order according to the keys, modulo issues -// raised by unorderable key values such as NaNs. -// -// The ordering rules are more general than with Go's < operator: -// -// - when applicable, nil compares low -// - ints, floats, and strings order by < -// - NaN compares less than non-NaN floats -// - bool compares false before true -// - complex compares real, then imag -// - pointers compare by machine address -// - channel values compare by machine address -// - structs compare each field in turn -// - arrays compare each element in turn. -// Otherwise identical arrays compare by length. -// - interface values compare first by reflect.Type describing the concrete type -// and then by concrete value as described in the previous rules. -func Sort(mapValue reflect.Value) *SortedMap { - if mapValue.Type().Kind() != reflect.Map { - return nil - } - // Note: this code is arranged to not panic even in the presence - // of a concurrent map update. The runtime is responsible for - // yelling loudly if that happens. See issue 33275. - n := mapValue.Len() - key := make([]reflect.Value, 0, n) - value := make([]reflect.Value, 0, n) - iter := mapValue.MapRange() - for iter.Next() { - key = append(key, iter.Key()) - value = append(value, iter.Value()) - } - sorted := &SortedMap{ - Key: key, - Value: value, - } - sort.Stable(sorted) - return sorted -} - -// compare compares two values of the same type. It returns -1, 0, 1 -// according to whether a > b (1), a == b (0), or a < b (-1). -// If the types differ, it returns -1. -// See the comment on Sort for the comparison rules. -func compare(aVal, bVal reflect.Value) int { - aType, bType := aVal.Type(), bVal.Type() - if aType != bType { - return -1 // No good answer possible, but don't return 0: they're not equal. - } - switch aVal.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - a, b := aVal.Int(), bVal.Int() - switch { - case a < b: - return -1 - case a > b: - return 1 - default: - return 0 - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - a, b := aVal.Uint(), bVal.Uint() - switch { - case a < b: - return -1 - case a > b: - return 1 - default: - return 0 - } - case reflect.String: - a, b := aVal.String(), bVal.String() - switch { - case a < b: - return -1 - case a > b: - return 1 - default: - return 0 - } - case reflect.Float32, reflect.Float64: - return floatCompare(aVal.Float(), bVal.Float()) - case reflect.Complex64, reflect.Complex128: - a, b := aVal.Complex(), bVal.Complex() - if c := floatCompare(real(a), real(b)); c != 0 { - return c - } - return floatCompare(imag(a), imag(b)) - case reflect.Bool: - a, b := aVal.Bool(), bVal.Bool() - switch { - case a == b: - return 0 - case a: - return 1 - default: - return -1 - } - case reflect.Ptr, reflect.UnsafePointer: - a, b := aVal.Pointer(), bVal.Pointer() - switch { - case a < b: - return -1 - case a > b: - return 1 - default: - return 0 - } - case reflect.Chan: - if c, ok := nilCompare(aVal, bVal); ok { - return c - } - ap, bp := aVal.Pointer(), bVal.Pointer() - switch { - case ap < bp: - return -1 - case ap > bp: - return 1 - default: - return 0 - } - case reflect.Struct: - for i := 0; i < aVal.NumField(); i++ { - if c := compare(aVal.Field(i), bVal.Field(i)); c != 0 { - return c - } - } - return 0 - case reflect.Array: - for i := 0; i < aVal.Len(); i++ { - if c := compare(aVal.Index(i), bVal.Index(i)); c != 0 { - return c - } - } - return 0 - case reflect.Interface: - if c, ok := nilCompare(aVal, bVal); ok { - return c - } - c := compare(reflect.ValueOf(aVal.Elem().Type()), reflect.ValueOf(bVal.Elem().Type())) - if c != 0 { - return c - } - return compare(aVal.Elem(), bVal.Elem()) - default: - // Certain types cannot appear as keys (maps, funcs, slices), but be explicit. - panic("bad type in compare: " + aType.String()) - } -} - -// nilCompare checks whether either value is nil. If not, the boolean is false. -// If either value is nil, the boolean is true and the integer is the comparison -// value. The comparison is defined to be 0 if both are nil, otherwise the one -// nil value compares low. Both arguments must represent a chan, func, -// interface, map, pointer, or slice. -func nilCompare(aVal, bVal reflect.Value) (int, bool) { - if aVal.IsNil() { - if bVal.IsNil() { - return 0, true - } - return -1, true - } - if bVal.IsNil() { - return 1, true - } - return 0, false -} - -// floatCompare compares two floating-point values. NaNs compare low. -func floatCompare(a, b float64) int { - switch { - case isNaN(a): - return -1 // No good answer if b is a NaN so don't bother checking. - case isNaN(b): - return 1 - case a < b: - return -1 - case a > b: - return 1 - } - return 0 -} - -func isNaN(a float64) bool { - return a != a -} diff --git a/internal/backport/go/ast/ast.go b/internal/backport/go/ast/ast.go deleted file mode 100644 index 9efdcf7c51..0000000000 --- a/internal/backport/go/ast/ast.go +++ /dev/null @@ -1,1067 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ast declares the types used to represent syntax trees for Go -// packages. -package ast - -import ( - "strings" - - "golang.org/x/website/internal/backport/go/token" -) - -// ---------------------------------------------------------------------------- -// Interfaces -// -// There are 3 main classes of nodes: Expressions and type nodes, -// statement nodes, and declaration nodes. The node names usually -// match the corresponding Go spec production names to which they -// correspond. The node fields correspond to the individual parts -// of the respective productions. -// -// All nodes contain position information marking the beginning of -// the corresponding source text segment; it is accessible via the -// Pos accessor method. Nodes may contain additional position info -// for language constructs where comments may be found between parts -// of the construct (typically any larger, parenthesized subpart). -// That position information is needed to properly position comments -// when printing the construct. - -// All node types implement the Node interface. -type Node interface { - Pos() token.Pos // position of first character belonging to the node - End() token.Pos // position of first character immediately after the node -} - -// All expression nodes implement the Expr interface. -type Expr interface { - Node - exprNode() -} - -// All statement nodes implement the Stmt interface. -type Stmt interface { - Node - stmtNode() -} - -// All declaration nodes implement the Decl interface. -type Decl interface { - Node - declNode() -} - -// ---------------------------------------------------------------------------- -// Comments - -// A Comment node represents a single //-style or /*-style comment. -// -// The Text field contains the comment text without carriage returns (\r) that -// may have been present in the source. Because a comment's end position is -// computed using len(Text), the position reported by End() does not match the -// true source end position for comments containing carriage returns. -type Comment struct { - Slash token.Pos // position of "/" starting the comment - Text string // comment text (excluding '\n' for //-style comments) -} - -func (c *Comment) Pos() token.Pos { return c.Slash } -func (c *Comment) End() token.Pos { return token.Pos(int(c.Slash) + len(c.Text)) } - -// A CommentGroup represents a sequence of comments -// with no other tokens and no empty lines between. -type CommentGroup struct { - List []*Comment // len(List) > 0 -} - -func (g *CommentGroup) Pos() token.Pos { return g.List[0].Pos() } -func (g *CommentGroup) End() token.Pos { return g.List[len(g.List)-1].End() } - -func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' } - -func stripTrailingWhitespace(s string) string { - i := len(s) - for i > 0 && isWhitespace(s[i-1]) { - i-- - } - return s[0:i] -} - -// Text returns the text of the comment. -// Comment markers (//, /*, and */), the first space of a line comment, and -// leading and trailing empty lines are removed. -// Comment directives like "//line" and "//go:noinline" are also removed. -// Multiple empty lines are reduced to one, and trailing space on lines is trimmed. -// Unless the result is empty, it is newline-terminated. -func (g *CommentGroup) Text() string { - if g == nil { - return "" - } - comments := make([]string, len(g.List)) - for i, c := range g.List { - comments[i] = c.Text - } - - lines := make([]string, 0, 10) // most comments are less than 10 lines - for _, c := range comments { - // Remove comment markers. - // The parser has given us exactly the comment text. - switch c[1] { - case '/': - //-style comment (no newline at the end) - c = c[2:] - if len(c) == 0 { - // empty line - break - } - if c[0] == ' ' { - // strip first space - required for Example tests - c = c[1:] - break - } - if isDirective(c) { - // Ignore //go:noinline, //line, and so on. - continue - } - case '*': - /*-style comment */ - c = c[2 : len(c)-2] - } - - // Split on newlines. - cl := strings.Split(c, "\n") - - // Walk lines, stripping trailing white space and adding to list. - for _, l := range cl { - lines = append(lines, stripTrailingWhitespace(l)) - } - } - - // Remove leading blank lines; convert runs of - // interior blank lines to a single blank line. - n := 0 - for _, line := range lines { - if line != "" || n > 0 && lines[n-1] != "" { - lines[n] = line - n++ - } - } - lines = lines[0:n] - - // Add final "" entry to get trailing newline from Join. - if n > 0 && lines[n-1] != "" { - lines = append(lines, "") - } - - return strings.Join(lines, "\n") -} - -// isDirective reports whether c is a comment directive. -// This code is also in go/printer. -func isDirective(c string) bool { - // "//line " is a line directive. - // "//extern " is for gccgo. - // "//export " is for cgo. - // (The // has been removed.) - if strings.HasPrefix(c, "line ") || strings.HasPrefix(c, "extern ") || strings.HasPrefix(c, "export ") { - return true - } - - // "//[a-z0-9]+:[a-z0-9]" - // (The // has been removed.) - colon := strings.Index(c, ":") - if colon <= 0 || colon+1 >= len(c) { - return false - } - for i := 0; i <= colon+1; i++ { - if i == colon { - continue - } - b := c[i] - if !('a' <= b && b <= 'z' || '0' <= b && b <= '9') { - return false - } - } - return true -} - -// ---------------------------------------------------------------------------- -// Expressions and types - -// A Field represents a Field declaration list in a struct type, -// a method list in an interface type, or a parameter/result declaration -// in a signature. -// Field.Names is nil for unnamed parameters (parameter lists which only contain types) -// and embedded struct fields. In the latter case, the field name is the type name. -type Field struct { - Doc *CommentGroup // associated documentation; or nil - Names []*Ident // field/method/(type) parameter names; or nil - Type Expr // field/method/parameter type; or nil - Tag *BasicLit // field tag; or nil - Comment *CommentGroup // line comments; or nil -} - -func (f *Field) Pos() token.Pos { - if len(f.Names) > 0 { - return f.Names[0].Pos() - } - if f.Type != nil { - return f.Type.Pos() - } - return token.NoPos -} - -func (f *Field) End() token.Pos { - if f.Tag != nil { - return f.Tag.End() - } - if f.Type != nil { - return f.Type.End() - } - if len(f.Names) > 0 { - return f.Names[len(f.Names)-1].End() - } - return token.NoPos -} - -// A FieldList represents a list of Fields, enclosed by parentheses, -// curly braces, or square brackets. -type FieldList struct { - Opening token.Pos // position of opening parenthesis/brace/bracket, if any - List []*Field // field list; or nil - Closing token.Pos // position of closing parenthesis/brace/bracket, if any -} - -func (f *FieldList) Pos() token.Pos { - if f.Opening.IsValid() { - return f.Opening - } - // the list should not be empty in this case; - // be conservative and guard against bad ASTs - if len(f.List) > 0 { - return f.List[0].Pos() - } - return token.NoPos -} - -func (f *FieldList) End() token.Pos { - if f.Closing.IsValid() { - return f.Closing + 1 - } - // the list should not be empty in this case; - // be conservative and guard against bad ASTs - if n := len(f.List); n > 0 { - return f.List[n-1].End() - } - return token.NoPos -} - -// NumFields returns the number of parameters or struct fields represented by a FieldList. -func (f *FieldList) NumFields() int { - n := 0 - if f != nil { - for _, g := range f.List { - m := len(g.Names) - if m == 0 { - m = 1 - } - n += m - } - } - return n -} - -// An expression is represented by a tree consisting of one -// or more of the following concrete expression nodes. -type ( - // A BadExpr node is a placeholder for an expression containing - // syntax errors for which a correct expression node cannot be - // created. - // - BadExpr struct { - From, To token.Pos // position range of bad expression - } - - // An Ident node represents an identifier. - Ident struct { - NamePos token.Pos // identifier position - Name string // identifier name - Obj *Object // denoted object; or nil - } - - // An Ellipsis node stands for the "..." type in a - // parameter list or the "..." length in an array type. - // - Ellipsis struct { - Ellipsis token.Pos // position of "..." - Elt Expr // ellipsis element type (parameter lists only); or nil - } - - // A BasicLit node represents a literal of basic type. - BasicLit struct { - ValuePos token.Pos // literal position - Kind token.Token // token.INT, token.FLOAT, token.IMAG, token.CHAR, or token.STRING - Value string // literal string; e.g. 42, 0x7f, 3.14, 1e-9, 2.4i, 'a', '\x7f', "foo" or `\m\n\o` - } - - // A FuncLit node represents a function literal. - FuncLit struct { - Type *FuncType // function type - Body *BlockStmt // function body - } - - // A CompositeLit node represents a composite literal. - CompositeLit struct { - Type Expr // literal type; or nil - Lbrace token.Pos // position of "{" - Elts []Expr // list of composite elements; or nil - Rbrace token.Pos // position of "}" - Incomplete bool // true if (source) expressions are missing in the Elts list - } - - // A ParenExpr node represents a parenthesized expression. - ParenExpr struct { - Lparen token.Pos // position of "(" - X Expr // parenthesized expression - Rparen token.Pos // position of ")" - } - - // A SelectorExpr node represents an expression followed by a selector. - SelectorExpr struct { - X Expr // expression - Sel *Ident // field selector - } - - // An IndexExpr node represents an expression followed by an index. - IndexExpr struct { - X Expr // expression - Lbrack token.Pos // position of "[" - Index Expr // index expression - Rbrack token.Pos // position of "]" - } - - // An IndexListExpr node represents an expression followed by multiple - // indices. - IndexListExpr struct { - X Expr // expression - Lbrack token.Pos // position of "[" - Indices []Expr // index expressions - Rbrack token.Pos // position of "]" - } - - // A SliceExpr node represents an expression followed by slice indices. - SliceExpr struct { - X Expr // expression - Lbrack token.Pos // position of "[" - Low Expr // begin of slice range; or nil - High Expr // end of slice range; or nil - Max Expr // maximum capacity of slice; or nil - Slice3 bool // true if 3-index slice (2 colons present) - Rbrack token.Pos // position of "]" - } - - // A TypeAssertExpr node represents an expression followed by a - // type assertion. - // - TypeAssertExpr struct { - X Expr // expression - Lparen token.Pos // position of "(" - Type Expr // asserted type; nil means type switch X.(type) - Rparen token.Pos // position of ")" - } - - // A CallExpr node represents an expression followed by an argument list. - CallExpr struct { - Fun Expr // function expression - Lparen token.Pos // position of "(" - Args []Expr // function arguments; or nil - Ellipsis token.Pos // position of "..." (token.NoPos if there is no "...") - Rparen token.Pos // position of ")" - } - - // A StarExpr node represents an expression of the form "*" Expression. - // Semantically it could be a unary "*" expression, or a pointer type. - // - StarExpr struct { - Star token.Pos // position of "*" - X Expr // operand - } - - // A UnaryExpr node represents a unary expression. - // Unary "*" expressions are represented via StarExpr nodes. - // - UnaryExpr struct { - OpPos token.Pos // position of Op - Op token.Token // operator - X Expr // operand - } - - // A BinaryExpr node represents a binary expression. - BinaryExpr struct { - X Expr // left operand - OpPos token.Pos // position of Op - Op token.Token // operator - Y Expr // right operand - } - - // A KeyValueExpr node represents (key : value) pairs - // in composite literals. - // - KeyValueExpr struct { - Key Expr - Colon token.Pos // position of ":" - Value Expr - } -) - -// The direction of a channel type is indicated by a bit -// mask including one or both of the following constants. -type ChanDir int - -const ( - SEND ChanDir = 1 << iota - RECV -) - -// A type is represented by a tree consisting of one -// or more of the following type-specific expression -// nodes. -type ( - // An ArrayType node represents an array or slice type. - ArrayType struct { - Lbrack token.Pos // position of "[" - Len Expr // Ellipsis node for [...]T array types, nil for slice types - Elt Expr // element type - } - - // A StructType node represents a struct type. - StructType struct { - Struct token.Pos // position of "struct" keyword - Fields *FieldList // list of field declarations - Incomplete bool // true if (source) fields are missing in the Fields list - } - - // Pointer types are represented via StarExpr nodes. - - // A FuncType node represents a function type. - FuncType struct { - Func token.Pos // position of "func" keyword (token.NoPos if there is no "func") - TypeParams *FieldList // type parameters; or nil - Params *FieldList // (incoming) parameters; non-nil - Results *FieldList // (outgoing) results; or nil - } - - // An InterfaceType node represents an interface type. - InterfaceType struct { - Interface token.Pos // position of "interface" keyword - Methods *FieldList // list of embedded interfaces, methods, or types - Incomplete bool // true if (source) methods or types are missing in the Methods list - } - - // A MapType node represents a map type. - MapType struct { - Map token.Pos // position of "map" keyword - Key Expr - Value Expr - } - - // A ChanType node represents a channel type. - ChanType struct { - Begin token.Pos // position of "chan" keyword or "<-" (whichever comes first) - Arrow token.Pos // position of "<-" (token.NoPos if there is no "<-") - Dir ChanDir // channel direction - Value Expr // value type - } -) - -// Pos and End implementations for expression/type nodes. - -func (x *BadExpr) Pos() token.Pos { return x.From } -func (x *Ident) Pos() token.Pos { return x.NamePos } -func (x *Ellipsis) Pos() token.Pos { return x.Ellipsis } -func (x *BasicLit) Pos() token.Pos { return x.ValuePos } -func (x *FuncLit) Pos() token.Pos { return x.Type.Pos() } -func (x *CompositeLit) Pos() token.Pos { - if x.Type != nil { - return x.Type.Pos() - } - return x.Lbrace -} -func (x *ParenExpr) Pos() token.Pos { return x.Lparen } -func (x *SelectorExpr) Pos() token.Pos { return x.X.Pos() } -func (x *IndexExpr) Pos() token.Pos { return x.X.Pos() } -func (x *IndexListExpr) Pos() token.Pos { return x.X.Pos() } -func (x *SliceExpr) Pos() token.Pos { return x.X.Pos() } -func (x *TypeAssertExpr) Pos() token.Pos { return x.X.Pos() } -func (x *CallExpr) Pos() token.Pos { return x.Fun.Pos() } -func (x *StarExpr) Pos() token.Pos { return x.Star } -func (x *UnaryExpr) Pos() token.Pos { return x.OpPos } -func (x *BinaryExpr) Pos() token.Pos { return x.X.Pos() } -func (x *KeyValueExpr) Pos() token.Pos { return x.Key.Pos() } -func (x *ArrayType) Pos() token.Pos { return x.Lbrack } -func (x *StructType) Pos() token.Pos { return x.Struct } -func (x *FuncType) Pos() token.Pos { - if x.Func.IsValid() || x.Params == nil { // see issue 3870 - return x.Func - } - return x.Params.Pos() // interface method declarations have no "func" keyword -} -func (x *InterfaceType) Pos() token.Pos { return x.Interface } -func (x *MapType) Pos() token.Pos { return x.Map } -func (x *ChanType) Pos() token.Pos { return x.Begin } - -func (x *BadExpr) End() token.Pos { return x.To } -func (x *Ident) End() token.Pos { return token.Pos(int(x.NamePos) + len(x.Name)) } -func (x *Ellipsis) End() token.Pos { - if x.Elt != nil { - return x.Elt.End() - } - return x.Ellipsis + 3 // len("...") -} -func (x *BasicLit) End() token.Pos { return token.Pos(int(x.ValuePos) + len(x.Value)) } -func (x *FuncLit) End() token.Pos { return x.Body.End() } -func (x *CompositeLit) End() token.Pos { return x.Rbrace + 1 } -func (x *ParenExpr) End() token.Pos { return x.Rparen + 1 } -func (x *SelectorExpr) End() token.Pos { return x.Sel.End() } -func (x *IndexExpr) End() token.Pos { return x.Rbrack + 1 } -func (x *IndexListExpr) End() token.Pos { return x.Rbrack + 1 } -func (x *SliceExpr) End() token.Pos { return x.Rbrack + 1 } -func (x *TypeAssertExpr) End() token.Pos { return x.Rparen + 1 } -func (x *CallExpr) End() token.Pos { return x.Rparen + 1 } -func (x *StarExpr) End() token.Pos { return x.X.End() } -func (x *UnaryExpr) End() token.Pos { return x.X.End() } -func (x *BinaryExpr) End() token.Pos { return x.Y.End() } -func (x *KeyValueExpr) End() token.Pos { return x.Value.End() } -func (x *ArrayType) End() token.Pos { return x.Elt.End() } -func (x *StructType) End() token.Pos { return x.Fields.End() } -func (x *FuncType) End() token.Pos { - if x.Results != nil { - return x.Results.End() - } - return x.Params.End() -} -func (x *InterfaceType) End() token.Pos { return x.Methods.End() } -func (x *MapType) End() token.Pos { return x.Value.End() } -func (x *ChanType) End() token.Pos { return x.Value.End() } - -// exprNode() ensures that only expression/type nodes can be -// assigned to an Expr. -func (*BadExpr) exprNode() {} -func (*Ident) exprNode() {} -func (*Ellipsis) exprNode() {} -func (*BasicLit) exprNode() {} -func (*FuncLit) exprNode() {} -func (*CompositeLit) exprNode() {} -func (*ParenExpr) exprNode() {} -func (*SelectorExpr) exprNode() {} -func (*IndexExpr) exprNode() {} -func (*IndexListExpr) exprNode() {} -func (*SliceExpr) exprNode() {} -func (*TypeAssertExpr) exprNode() {} -func (*CallExpr) exprNode() {} -func (*StarExpr) exprNode() {} -func (*UnaryExpr) exprNode() {} -func (*BinaryExpr) exprNode() {} -func (*KeyValueExpr) exprNode() {} - -func (*ArrayType) exprNode() {} -func (*StructType) exprNode() {} -func (*FuncType) exprNode() {} -func (*InterfaceType) exprNode() {} -func (*MapType) exprNode() {} -func (*ChanType) exprNode() {} - -// ---------------------------------------------------------------------------- -// Convenience functions for Idents - -// NewIdent creates a new Ident without position. -// Useful for ASTs generated by code other than the Go parser. -func NewIdent(name string) *Ident { return &Ident{token.NoPos, name, nil} } - -// IsExported reports whether name starts with an upper-case letter. -func IsExported(name string) bool { return token.IsExported(name) } - -// IsExported reports whether id starts with an upper-case letter. -func (id *Ident) IsExported() bool { return token.IsExported(id.Name) } - -func (id *Ident) String() string { - if id != nil { - return id.Name - } - return "" -} - -// ---------------------------------------------------------------------------- -// Statements - -// A statement is represented by a tree consisting of one -// or more of the following concrete statement nodes. -type ( - // A BadStmt node is a placeholder for statements containing - // syntax errors for which no correct statement nodes can be - // created. - // - BadStmt struct { - From, To token.Pos // position range of bad statement - } - - // A DeclStmt node represents a declaration in a statement list. - DeclStmt struct { - Decl Decl // *GenDecl with CONST, TYPE, or VAR token - } - - // An EmptyStmt node represents an empty statement. - // The "position" of the empty statement is the position - // of the immediately following (explicit or implicit) semicolon. - // - EmptyStmt struct { - Semicolon token.Pos // position of following ";" - Implicit bool // if set, ";" was omitted in the source - } - - // A LabeledStmt node represents a labeled statement. - LabeledStmt struct { - Label *Ident - Colon token.Pos // position of ":" - Stmt Stmt - } - - // An ExprStmt node represents a (stand-alone) expression - // in a statement list. - // - ExprStmt struct { - X Expr // expression - } - - // A SendStmt node represents a send statement. - SendStmt struct { - Chan Expr - Arrow token.Pos // position of "<-" - Value Expr - } - - // An IncDecStmt node represents an increment or decrement statement. - IncDecStmt struct { - X Expr - TokPos token.Pos // position of Tok - Tok token.Token // INC or DEC - } - - // An AssignStmt node represents an assignment or - // a short variable declaration. - // - AssignStmt struct { - Lhs []Expr - TokPos token.Pos // position of Tok - Tok token.Token // assignment token, DEFINE - Rhs []Expr - } - - // A GoStmt node represents a go statement. - GoStmt struct { - Go token.Pos // position of "go" keyword - Call *CallExpr - } - - // A DeferStmt node represents a defer statement. - DeferStmt struct { - Defer token.Pos // position of "defer" keyword - Call *CallExpr - } - - // A ReturnStmt node represents a return statement. - ReturnStmt struct { - Return token.Pos // position of "return" keyword - Results []Expr // result expressions; or nil - } - - // A BranchStmt node represents a break, continue, goto, - // or fallthrough statement. - // - BranchStmt struct { - TokPos token.Pos // position of Tok - Tok token.Token // keyword token (BREAK, CONTINUE, GOTO, FALLTHROUGH) - Label *Ident // label name; or nil - } - - // A BlockStmt node represents a braced statement list. - BlockStmt struct { - Lbrace token.Pos // position of "{" - List []Stmt - Rbrace token.Pos // position of "}", if any (may be absent due to syntax error) - } - - // An IfStmt node represents an if statement. - IfStmt struct { - If token.Pos // position of "if" keyword - Init Stmt // initialization statement; or nil - Cond Expr // condition - Body *BlockStmt - Else Stmt // else branch; or nil - } - - // A CaseClause represents a case of an expression or type switch statement. - CaseClause struct { - Case token.Pos // position of "case" or "default" keyword - List []Expr // list of expressions or types; nil means default case - Colon token.Pos // position of ":" - Body []Stmt // statement list; or nil - } - - // A SwitchStmt node represents an expression switch statement. - SwitchStmt struct { - Switch token.Pos // position of "switch" keyword - Init Stmt // initialization statement; or nil - Tag Expr // tag expression; or nil - Body *BlockStmt // CaseClauses only - } - - // A TypeSwitchStmt node represents a type switch statement. - TypeSwitchStmt struct { - Switch token.Pos // position of "switch" keyword - Init Stmt // initialization statement; or nil - Assign Stmt // x := y.(type) or y.(type) - Body *BlockStmt // CaseClauses only - } - - // A CommClause node represents a case of a select statement. - CommClause struct { - Case token.Pos // position of "case" or "default" keyword - Comm Stmt // send or receive statement; nil means default case - Colon token.Pos // position of ":" - Body []Stmt // statement list; or nil - } - - // A SelectStmt node represents a select statement. - SelectStmt struct { - Select token.Pos // position of "select" keyword - Body *BlockStmt // CommClauses only - } - - // A ForStmt represents a for statement. - ForStmt struct { - For token.Pos // position of "for" keyword - Init Stmt // initialization statement; or nil - Cond Expr // condition; or nil - Post Stmt // post iteration statement; or nil - Body *BlockStmt - } - - // A RangeStmt represents a for statement with a range clause. - RangeStmt struct { - For token.Pos // position of "for" keyword - Key, Value Expr // Key, Value may be nil - TokPos token.Pos // position of Tok; invalid if Key == nil - Tok token.Token // ILLEGAL if Key == nil, ASSIGN, DEFINE - X Expr // value to range over - Body *BlockStmt - } -) - -// Pos and End implementations for statement nodes. - -func (s *BadStmt) Pos() token.Pos { return s.From } -func (s *DeclStmt) Pos() token.Pos { return s.Decl.Pos() } -func (s *EmptyStmt) Pos() token.Pos { return s.Semicolon } -func (s *LabeledStmt) Pos() token.Pos { return s.Label.Pos() } -func (s *ExprStmt) Pos() token.Pos { return s.X.Pos() } -func (s *SendStmt) Pos() token.Pos { return s.Chan.Pos() } -func (s *IncDecStmt) Pos() token.Pos { return s.X.Pos() } -func (s *AssignStmt) Pos() token.Pos { return s.Lhs[0].Pos() } -func (s *GoStmt) Pos() token.Pos { return s.Go } -func (s *DeferStmt) Pos() token.Pos { return s.Defer } -func (s *ReturnStmt) Pos() token.Pos { return s.Return } -func (s *BranchStmt) Pos() token.Pos { return s.TokPos } -func (s *BlockStmt) Pos() token.Pos { return s.Lbrace } -func (s *IfStmt) Pos() token.Pos { return s.If } -func (s *CaseClause) Pos() token.Pos { return s.Case } -func (s *SwitchStmt) Pos() token.Pos { return s.Switch } -func (s *TypeSwitchStmt) Pos() token.Pos { return s.Switch } -func (s *CommClause) Pos() token.Pos { return s.Case } -func (s *SelectStmt) Pos() token.Pos { return s.Select } -func (s *ForStmt) Pos() token.Pos { return s.For } -func (s *RangeStmt) Pos() token.Pos { return s.For } - -func (s *BadStmt) End() token.Pos { return s.To } -func (s *DeclStmt) End() token.Pos { return s.Decl.End() } -func (s *EmptyStmt) End() token.Pos { - if s.Implicit { - return s.Semicolon - } - return s.Semicolon + 1 /* len(";") */ -} -func (s *LabeledStmt) End() token.Pos { return s.Stmt.End() } -func (s *ExprStmt) End() token.Pos { return s.X.End() } -func (s *SendStmt) End() token.Pos { return s.Value.End() } -func (s *IncDecStmt) End() token.Pos { - return s.TokPos + 2 /* len("++") */ -} -func (s *AssignStmt) End() token.Pos { return s.Rhs[len(s.Rhs)-1].End() } -func (s *GoStmt) End() token.Pos { return s.Call.End() } -func (s *DeferStmt) End() token.Pos { return s.Call.End() } -func (s *ReturnStmt) End() token.Pos { - if n := len(s.Results); n > 0 { - return s.Results[n-1].End() - } - return s.Return + 6 // len("return") -} -func (s *BranchStmt) End() token.Pos { - if s.Label != nil { - return s.Label.End() - } - return token.Pos(int(s.TokPos) + len(s.Tok.String())) -} -func (s *BlockStmt) End() token.Pos { - if s.Rbrace.IsValid() { - return s.Rbrace + 1 - } - if n := len(s.List); n > 0 { - return s.List[n-1].End() - } - return s.Lbrace + 1 -} -func (s *IfStmt) End() token.Pos { - if s.Else != nil { - return s.Else.End() - } - return s.Body.End() -} -func (s *CaseClause) End() token.Pos { - if n := len(s.Body); n > 0 { - return s.Body[n-1].End() - } - return s.Colon + 1 -} -func (s *SwitchStmt) End() token.Pos { return s.Body.End() } -func (s *TypeSwitchStmt) End() token.Pos { return s.Body.End() } -func (s *CommClause) End() token.Pos { - if n := len(s.Body); n > 0 { - return s.Body[n-1].End() - } - return s.Colon + 1 -} -func (s *SelectStmt) End() token.Pos { return s.Body.End() } -func (s *ForStmt) End() token.Pos { return s.Body.End() } -func (s *RangeStmt) End() token.Pos { return s.Body.End() } - -// stmtNode() ensures that only statement nodes can be -// assigned to a Stmt. -func (*BadStmt) stmtNode() {} -func (*DeclStmt) stmtNode() {} -func (*EmptyStmt) stmtNode() {} -func (*LabeledStmt) stmtNode() {} -func (*ExprStmt) stmtNode() {} -func (*SendStmt) stmtNode() {} -func (*IncDecStmt) stmtNode() {} -func (*AssignStmt) stmtNode() {} -func (*GoStmt) stmtNode() {} -func (*DeferStmt) stmtNode() {} -func (*ReturnStmt) stmtNode() {} -func (*BranchStmt) stmtNode() {} -func (*BlockStmt) stmtNode() {} -func (*IfStmt) stmtNode() {} -func (*CaseClause) stmtNode() {} -func (*SwitchStmt) stmtNode() {} -func (*TypeSwitchStmt) stmtNode() {} -func (*CommClause) stmtNode() {} -func (*SelectStmt) stmtNode() {} -func (*ForStmt) stmtNode() {} -func (*RangeStmt) stmtNode() {} - -// ---------------------------------------------------------------------------- -// Declarations - -// A Spec node represents a single (non-parenthesized) import, -// constant, type, or variable declaration. -type ( - // The Spec type stands for any of *ImportSpec, *ValueSpec, and *TypeSpec. - Spec interface { - Node - specNode() - } - - // An ImportSpec node represents a single package import. - ImportSpec struct { - Doc *CommentGroup // associated documentation; or nil - Name *Ident // local package name (including "."); or nil - Path *BasicLit // import path - Comment *CommentGroup // line comments; or nil - EndPos token.Pos // end of spec (overrides Path.Pos if nonzero) - } - - // A ValueSpec node represents a constant or variable declaration - // (ConstSpec or VarSpec production). - // - ValueSpec struct { - Doc *CommentGroup // associated documentation; or nil - Names []*Ident // value names (len(Names) > 0) - Type Expr // value type; or nil - Values []Expr // initial values; or nil - Comment *CommentGroup // line comments; or nil - } - - // A TypeSpec node represents a type declaration (TypeSpec production). - TypeSpec struct { - Doc *CommentGroup // associated documentation; or nil - Name *Ident // type name - TypeParams *FieldList // type parameters; or nil - Assign token.Pos // position of '=', if any - Type Expr // *Ident, *ParenExpr, *SelectorExpr, *StarExpr, or any of the *XxxTypes - Comment *CommentGroup // line comments; or nil - } -) - -// Pos and End implementations for spec nodes. - -func (s *ImportSpec) Pos() token.Pos { - if s.Name != nil { - return s.Name.Pos() - } - return s.Path.Pos() -} -func (s *ValueSpec) Pos() token.Pos { return s.Names[0].Pos() } -func (s *TypeSpec) Pos() token.Pos { return s.Name.Pos() } - -func (s *ImportSpec) End() token.Pos { - if s.EndPos != 0 { - return s.EndPos - } - return s.Path.End() -} - -func (s *ValueSpec) End() token.Pos { - if n := len(s.Values); n > 0 { - return s.Values[n-1].End() - } - if s.Type != nil { - return s.Type.End() - } - return s.Names[len(s.Names)-1].End() -} -func (s *TypeSpec) End() token.Pos { return s.Type.End() } - -// specNode() ensures that only spec nodes can be -// assigned to a Spec. -func (*ImportSpec) specNode() {} -func (*ValueSpec) specNode() {} -func (*TypeSpec) specNode() {} - -// A declaration is represented by one of the following declaration nodes. -type ( - // A BadDecl node is a placeholder for a declaration containing - // syntax errors for which a correct declaration node cannot be - // created. - // - BadDecl struct { - From, To token.Pos // position range of bad declaration - } - - // A GenDecl node (generic declaration node) represents an import, - // constant, type or variable declaration. A valid Lparen position - // (Lparen.IsValid()) indicates a parenthesized declaration. - // - // Relationship between Tok value and Specs element type: - // - // token.IMPORT *ImportSpec - // token.CONST *ValueSpec - // token.TYPE *TypeSpec - // token.VAR *ValueSpec - // - GenDecl struct { - Doc *CommentGroup // associated documentation; or nil - TokPos token.Pos // position of Tok - Tok token.Token // IMPORT, CONST, TYPE, or VAR - Lparen token.Pos // position of '(', if any - Specs []Spec - Rparen token.Pos // position of ')', if any - } - - // A FuncDecl node represents a function declaration. - FuncDecl struct { - Doc *CommentGroup // associated documentation; or nil - Recv *FieldList // receiver (methods); or nil (functions) - Name *Ident // function/method name - Type *FuncType // function signature: type and value parameters, results, and position of "func" keyword - Body *BlockStmt // function body; or nil for external (non-Go) function - } -) - -// Pos and End implementations for declaration nodes. - -func (d *BadDecl) Pos() token.Pos { return d.From } -func (d *GenDecl) Pos() token.Pos { return d.TokPos } -func (d *FuncDecl) Pos() token.Pos { return d.Type.Pos() } - -func (d *BadDecl) End() token.Pos { return d.To } -func (d *GenDecl) End() token.Pos { - if d.Rparen.IsValid() { - return d.Rparen + 1 - } - return d.Specs[0].End() -} -func (d *FuncDecl) End() token.Pos { - if d.Body != nil { - return d.Body.End() - } - return d.Type.End() -} - -// declNode() ensures that only declaration nodes can be -// assigned to a Decl. -func (*BadDecl) declNode() {} -func (*GenDecl) declNode() {} -func (*FuncDecl) declNode() {} - -// ---------------------------------------------------------------------------- -// Files and packages - -// A File node represents a Go source file. -// -// The Comments list contains all comments in the source file in order of -// appearance, including the comments that are pointed to from other nodes -// via Doc and Comment fields. -// -// For correct printing of source code containing comments (using packages -// go/format and go/printer), special care must be taken to update comments -// when a File's syntax tree is modified: For printing, comments are interspersed -// between tokens based on their position. If syntax tree nodes are -// removed or moved, relevant comments in their vicinity must also be removed -// (from the File.Comments list) or moved accordingly (by updating their -// positions). A CommentMap may be used to facilitate some of these operations. -// -// Whether and how a comment is associated with a node depends on the -// interpretation of the syntax tree by the manipulating program: Except for Doc -// and Comment comments directly associated with nodes, the remaining comments -// are "free-floating" (see also issues #18593, #20744). -type File struct { - Doc *CommentGroup // associated documentation; or nil - Package token.Pos // position of "package" keyword - Name *Ident // package name - Decls []Decl // top-level declarations; or nil - Scope *Scope // package scope (this file only) - Imports []*ImportSpec // imports in this file - Unresolved []*Ident // unresolved identifiers in this file - Comments []*CommentGroup // list of all comments in the source file -} - -func (f *File) Pos() token.Pos { return f.Package } -func (f *File) End() token.Pos { - if n := len(f.Decls); n > 0 { - return f.Decls[n-1].End() - } - return f.Name.End() -} - -// A Package node represents a set of source files -// collectively building a Go package. -type Package struct { - Name string // package name - Scope *Scope // package scope across all files - Imports map[string]*Object // map of package id -> package object - Files map[string]*File // Go source files by filename -} - -func (p *Package) Pos() token.Pos { return token.NoPos } -func (p *Package) End() token.Pos { return token.NoPos } diff --git a/internal/backport/go/ast/ast_test.go b/internal/backport/go/ast/ast_test.go deleted file mode 100644 index 66ae884867..0000000000 --- a/internal/backport/go/ast/ast_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast - -import ( - "testing" -) - -var comments = []struct { - list []string - text string -}{ - {[]string{"//"}, ""}, - {[]string{"// "}, ""}, - {[]string{"//", "//", "// "}, ""}, - {[]string{"// foo "}, "foo\n"}, - {[]string{"//", "//", "// foo"}, "foo\n"}, - {[]string{"// foo bar "}, "foo bar\n"}, - {[]string{"// foo", "// bar"}, "foo\nbar\n"}, - {[]string{"// foo", "//", "//", "//", "// bar"}, "foo\n\nbar\n"}, - {[]string{"// foo", "/* bar */"}, "foo\n bar\n"}, - {[]string{"//", "//", "//", "// foo", "//", "//", "//"}, "foo\n"}, - - {[]string{"/**/"}, ""}, - {[]string{"/* */"}, ""}, - {[]string{"/**/", "/**/", "/* */"}, ""}, - {[]string{"/* Foo */"}, " Foo\n"}, - {[]string{"/* Foo Bar */"}, " Foo Bar\n"}, - {[]string{"/* Foo*/", "/* Bar*/"}, " Foo\n Bar\n"}, - {[]string{"/* Foo*/", "/**/", "/**/", "/**/", "// Bar"}, " Foo\n\nBar\n"}, - {[]string{"/* Foo*/", "/*\n*/", "//", "/*\n*/", "// Bar"}, " Foo\n\nBar\n"}, - {[]string{"/* Foo*/", "// Bar"}, " Foo\nBar\n"}, - {[]string{"/* Foo\n Bar*/"}, " Foo\n Bar\n"}, - - {[]string{"// foo", "//go:noinline", "// bar", "//:baz"}, "foo\nbar\n:baz\n"}, - {[]string{"// foo", "//lint123:ignore", "// bar"}, "foo\nbar\n"}, -} - -func TestCommentText(t *testing.T) { - for i, c := range comments { - list := make([]*Comment, len(c.list)) - for i, s := range c.list { - list[i] = &Comment{Text: s} - } - - text := (&CommentGroup{list}).Text() - if text != c.text { - t.Errorf("case %d: got %q; expected %q", i, text, c.text) - } - } -} - -var isDirectiveTests = []struct { - in string - ok bool -}{ - {"abc", false}, - {"go:inline", true}, - {"Go:inline", false}, - {"go:Inline", false}, - {":inline", false}, - {"lint:ignore", true}, - {"lint:1234", true}, - {"1234:lint", true}, - {"go: inline", false}, - {"go:", false}, - {"go:*", false}, - {"go:x*", true}, - {"export foo", true}, - {"extern foo", true}, - {"expert foo", false}, -} - -func TestIsDirective(t *testing.T) { - for _, tt := range isDirectiveTests { - if ok := isDirective(tt.in); ok != tt.ok { - t.Errorf("isDirective(%q) = %v, want %v", tt.in, ok, tt.ok) - } - } -} diff --git a/internal/backport/go/ast/commentmap.go b/internal/backport/go/ast/commentmap.go deleted file mode 100644 index 5e636055ed..0000000000 --- a/internal/backport/go/ast/commentmap.go +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast - -import ( - "bytes" - "fmt" - "golang.org/x/website/internal/backport/go/token" - "sort" -) - -type byPos []*CommentGroup - -func (a byPos) Len() int { return len(a) } -func (a byPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() } -func (a byPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -// sortComments sorts the list of comment groups in source order. -func sortComments(list []*CommentGroup) { - // TODO(gri): Does it make sense to check for sorted-ness - // first (because we know that sorted-ness is - // very likely)? - if orderedList := byPos(list); !sort.IsSorted(orderedList) { - sort.Sort(orderedList) - } -} - -// A CommentMap maps an AST node to a list of comment groups -// associated with it. See NewCommentMap for a description of -// the association. -type CommentMap map[Node][]*CommentGroup - -func (cmap CommentMap) addComment(n Node, c *CommentGroup) { - list := cmap[n] - if len(list) == 0 { - list = []*CommentGroup{c} - } else { - list = append(list, c) - } - cmap[n] = list -} - -type byInterval []Node - -func (a byInterval) Len() int { return len(a) } -func (a byInterval) Less(i, j int) bool { - pi, pj := a[i].Pos(), a[j].Pos() - return pi < pj || pi == pj && a[i].End() > a[j].End() -} -func (a byInterval) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -// nodeList returns the list of nodes of the AST n in source order. -func nodeList(n Node) []Node { - var list []Node - Inspect(n, func(n Node) bool { - // don't collect comments - switch n.(type) { - case nil, *CommentGroup, *Comment: - return false - } - list = append(list, n) - return true - }) - // Note: The current implementation assumes that Inspect traverses the - // AST in depth-first and thus _source_ order. If AST traversal - // does not follow source order, the sorting call below will be - // required. - // sort.Sort(byInterval(list)) - return list -} - -// A commentListReader helps iterating through a list of comment groups. -type commentListReader struct { - fset *token.FileSet - list []*CommentGroup - index int - comment *CommentGroup // comment group at current index - pos, end token.Position // source interval of comment group at current index -} - -func (r *commentListReader) eol() bool { - return r.index >= len(r.list) -} - -func (r *commentListReader) next() { - if !r.eol() { - r.comment = r.list[r.index] - r.pos = r.fset.Position(r.comment.Pos()) - r.end = r.fset.Position(r.comment.End()) - r.index++ - } -} - -// A nodeStack keeps track of nested nodes. -// A node lower on the stack lexically contains the nodes higher on the stack. -type nodeStack []Node - -// push pops all nodes that appear lexically before n -// and then pushes n on the stack. -func (s *nodeStack) push(n Node) { - s.pop(n.Pos()) - *s = append((*s), n) -} - -// pop pops all nodes that appear lexically before pos -// (i.e., whose lexical extent has ended before or at pos). -// It returns the last node popped. -func (s *nodeStack) pop(pos token.Pos) (top Node) { - i := len(*s) - for i > 0 && (*s)[i-1].End() <= pos { - top = (*s)[i-1] - i-- - } - *s = (*s)[0:i] - return top -} - -// NewCommentMap creates a new comment map by associating comment groups -// of the comments list with the nodes of the AST specified by node. -// -// A comment group g is associated with a node n if: -// -// - g starts on the same line as n ends -// - g starts on the line immediately following n, and there is -// at least one empty line after g and before the next node -// - g starts before n and is not associated to the node before n -// via the previous rules -// -// NewCommentMap tries to associate a comment group to the "largest" -// node possible: For instance, if the comment is a line comment -// trailing an assignment, the comment is associated with the entire -// assignment rather than just the last operand in the assignment. -func NewCommentMap(fset *token.FileSet, node Node, comments []*CommentGroup) CommentMap { - if len(comments) == 0 { - return nil // no comments to map - } - - cmap := make(CommentMap) - - // set up comment reader r - tmp := make([]*CommentGroup, len(comments)) - copy(tmp, comments) // don't change incoming comments - sortComments(tmp) - r := commentListReader{fset: fset, list: tmp} // !r.eol() because len(comments) > 0 - r.next() - - // create node list in lexical order - nodes := nodeList(node) - nodes = append(nodes, nil) // append sentinel - - // set up iteration variables - var ( - p Node // previous node - pend token.Position // end of p - pg Node // previous node group (enclosing nodes of "importance") - pgend token.Position // end of pg - stack nodeStack // stack of node groups - ) - - for _, q := range nodes { - var qpos token.Position - if q != nil { - qpos = fset.Position(q.Pos()) // current node position - } else { - // set fake sentinel position to infinity so that - // all comments get processed before the sentinel - const infinity = 1 << 30 - qpos.Offset = infinity - qpos.Line = infinity - } - - // process comments before current node - for r.end.Offset <= qpos.Offset { - // determine recent node group - if top := stack.pop(r.comment.Pos()); top != nil { - pg = top - pgend = fset.Position(pg.End()) - } - // Try to associate a comment first with a node group - // (i.e., a node of "importance" such as a declaration); - // if that fails, try to associate it with the most recent - // node. - // TODO(gri) try to simplify the logic below - var assoc Node - switch { - case pg != nil && - (pgend.Line == r.pos.Line || - pgend.Line+1 == r.pos.Line && r.end.Line+1 < qpos.Line): - // 1) comment starts on same line as previous node group ends, or - // 2) comment starts on the line immediately after the - // previous node group and there is an empty line before - // the current node - // => associate comment with previous node group - assoc = pg - case p != nil && - (pend.Line == r.pos.Line || - pend.Line+1 == r.pos.Line && r.end.Line+1 < qpos.Line || - q == nil): - // same rules apply as above for p rather than pg, - // but also associate with p if we are at the end (q == nil) - assoc = p - default: - // otherwise, associate comment with current node - if q == nil { - // we can only reach here if there was no p - // which would imply that there were no nodes - panic("internal error: no comments should be associated with sentinel") - } - assoc = q - } - cmap.addComment(assoc, r.comment) - if r.eol() { - return cmap - } - r.next() - } - - // update previous node - p = q - pend = fset.Position(p.End()) - - // update previous node group if we see an "important" node - switch q.(type) { - case *File, *Field, Decl, Spec, Stmt: - stack.push(q) - } - } - - return cmap -} - -// Update replaces an old node in the comment map with the new node -// and returns the new node. Comments that were associated with the -// old node are associated with the new node. -func (cmap CommentMap) Update(old, new Node) Node { - if list := cmap[old]; len(list) > 0 { - delete(cmap, old) - cmap[new] = append(cmap[new], list...) - } - return new -} - -// Filter returns a new comment map consisting of only those -// entries of cmap for which a corresponding node exists in -// the AST specified by node. -func (cmap CommentMap) Filter(node Node) CommentMap { - umap := make(CommentMap) - Inspect(node, func(n Node) bool { - if g := cmap[n]; len(g) > 0 { - umap[n] = g - } - return true - }) - return umap -} - -// Comments returns the list of comment groups in the comment map. -// The result is sorted in source order. -func (cmap CommentMap) Comments() []*CommentGroup { - list := make([]*CommentGroup, 0, len(cmap)) - for _, e := range cmap { - list = append(list, e...) - } - sortComments(list) - return list -} - -func summary(list []*CommentGroup) string { - const maxLen = 40 - var buf bytes.Buffer - - // collect comments text -loop: - for _, group := range list { - // Note: CommentGroup.Text() does too much work for what we - // need and would only replace this innermost loop. - // Just do it explicitly. - for _, comment := range group.List { - if buf.Len() >= maxLen { - break loop - } - buf.WriteString(comment.Text) - } - } - - // truncate if too long - if buf.Len() > maxLen { - buf.Truncate(maxLen - 3) - buf.WriteString("...") - } - - // replace any invisibles with blanks - bytes := buf.Bytes() - for i, b := range bytes { - switch b { - case '\t', '\n', '\r': - bytes[i] = ' ' - } - } - - return string(bytes) -} - -func (cmap CommentMap) String() string { - // print map entries in sorted order - var nodes []Node - for node := range cmap { - nodes = append(nodes, node) - } - sort.Sort(byInterval(nodes)) - - var buf bytes.Buffer - fmt.Fprintln(&buf, "CommentMap {") - for _, node := range nodes { - comment := cmap[node] - // print name of identifiers; print node type for other nodes - var s string - if ident, ok := node.(*Ident); ok { - s = ident.Name - } else { - s = fmt.Sprintf("%T", node) - } - fmt.Fprintf(&buf, "\t%p %20s: %s\n", node, s, summary(comment)) - } - fmt.Fprintln(&buf, "}") - return buf.String() -} diff --git a/internal/backport/go/ast/commentmap_test.go b/internal/backport/go/ast/commentmap_test.go deleted file mode 100644 index 67c2daf3c4..0000000000 --- a/internal/backport/go/ast/commentmap_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// To avoid a cyclic dependency with go/parser, this file is in a separate package. - -package ast_test - -import ( - "bytes" - "fmt" - "sort" - "testing" - - . "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -const src = ` -// the very first comment - -// package p -package p /* the name is p */ - -// imports -import ( - "bytes" // bytes - "fmt" // fmt - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" -) - -// T -type T struct { - a, b, c int // associated with a, b, c - // associated with x, y - x, y float64 // float values - z complex128 // complex value -} -// also associated with T - -// x -var x = 0 // x = 0 -// also associated with x - -// f1 -func f1() { - /* associated with s1 */ - s1() - // also associated with s1 - - // associated with s2 - - // also associated with s2 - s2() // line comment for s2 -} -// associated with f1 -// also associated with f1 - -// associated with f2 - -// f2 -func f2() { -} - -func f3() { - i := 1 /* 1 */ + 2 // addition - _ = i -} - -// the very last comment -` - -// res maps a key of the form "line number: node type" -// to the associated comments' text. -var res = map[string]string{ - " 5: *ast.File": "the very first comment\npackage p\n", - " 5: *ast.Ident": " the name is p\n", - " 8: *ast.GenDecl": "imports\n", - " 9: *ast.ImportSpec": "bytes\n", - "10: *ast.ImportSpec": "fmt\n", - "16: *ast.GenDecl": "T\nalso associated with T\n", - "17: *ast.Field": "associated with a, b, c\n", - "19: *ast.Field": "associated with x, y\nfloat values\n", - "20: *ast.Field": "complex value\n", - "25: *ast.GenDecl": "x\nx = 0\nalso associated with x\n", - "29: *ast.FuncDecl": "f1\nassociated with f1\nalso associated with f1\n", - "31: *ast.ExprStmt": " associated with s1\nalso associated with s1\n", - "37: *ast.ExprStmt": "associated with s2\nalso associated with s2\nline comment for s2\n", - "45: *ast.FuncDecl": "associated with f2\nf2\n", - "49: *ast.AssignStmt": "addition\n", - "49: *ast.BasicLit": " 1\n", - "50: *ast.Ident": "the very last comment\n", -} - -func ctext(list []*CommentGroup) string { - var buf bytes.Buffer - for _, g := range list { - buf.WriteString(g.Text()) - } - return buf.String() -} - -func TestCommentMap(t *testing.T) { - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - cmap := NewCommentMap(fset, f, f.Comments) - - // very correct association of comments - for n, list := range cmap { - key := fmt.Sprintf("%2d: %T", fset.Position(n.Pos()).Line, n) - got := ctext(list) - want := res[key] - if got != want { - t.Errorf("%s: got %q; want %q", key, got, want) - } - } - - // verify that no comments got lost - if n := len(cmap.Comments()); n != len(f.Comments) { - t.Errorf("got %d comment groups in map; want %d", n, len(f.Comments)) - } - - // support code to update test: - // set genMap to true to generate res map - const genMap = false - if genMap { - out := make([]string, 0, len(cmap)) - for n, list := range cmap { - out = append(out, fmt.Sprintf("\t\"%2d: %T\":\t%q,", fset.Position(n.Pos()).Line, n, ctext(list))) - } - sort.Strings(out) - for _, s := range out { - fmt.Println(s) - } - } -} - -func TestFilter(t *testing.T) { - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - cmap := NewCommentMap(fset, f, f.Comments) - - // delete variable declaration - for i, decl := range f.Decls { - if gen, ok := decl.(*GenDecl); ok && gen.Tok == token.VAR { - copy(f.Decls[i:], f.Decls[i+1:]) - f.Decls = f.Decls[:len(f.Decls)-1] - break - } - } - - // check if comments are filtered correctly - cc := cmap.Filter(f) - for n, list := range cc { - key := fmt.Sprintf("%2d: %T", fset.Position(n.Pos()).Line, n) - got := ctext(list) - want := res[key] - if key == "25: *ast.GenDecl" || got != want { - t.Errorf("%s: got %q; want %q", key, got, want) - } - } -} diff --git a/internal/backport/go/ast/example_test.go b/internal/backport/go/ast/example_test.go deleted file mode 100644 index ae92618aad..0000000000 --- a/internal/backport/go/ast/example_test.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast_test - -import ( - "bytes" - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/format" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -// This example demonstrates how to inspect the AST of a Go program. -func ExampleInspect() { - // src is the input for which we want to inspect the AST. - src := ` -package p -const c = 1.0 -var X = f(3.14)*2 + c -` - - // Create the AST by parsing src. - fset := token.NewFileSet() // positions are relative to fset - f, err := parser.ParseFile(fset, "src.go", src, 0) - if err != nil { - panic(err) - } - - // Inspect the AST and print all identifiers and literals. - ast.Inspect(f, func(n ast.Node) bool { - var s string - switch x := n.(type) { - case *ast.BasicLit: - s = x.Value - case *ast.Ident: - s = x.Name - } - if s != "" { - fmt.Printf("%s:\t%s\n", fset.Position(n.Pos()), s) - } - return true - }) - - // Output: - // src.go:2:9: p - // src.go:3:7: c - // src.go:3:11: 1.0 - // src.go:4:5: X - // src.go:4:9: f - // src.go:4:11: 3.14 - // src.go:4:17: 2 - // src.go:4:21: c -} - -// This example shows what an AST looks like when printed for debugging. -func ExamplePrint() { - // src is the input for which we want to print the AST. - src := ` -package main -func main() { - println("Hello, World!") -} -` - - // Create the AST by parsing src. - fset := token.NewFileSet() // positions are relative to fset - f, err := parser.ParseFile(fset, "", src, 0) - if err != nil { - panic(err) - } - - // Print the AST. - ast.Print(fset, f) - - // Output: - // 0 *ast.File { - // 1 . Package: 2:1 - // 2 . Name: *ast.Ident { - // 3 . . NamePos: 2:9 - // 4 . . Name: "main" - // 5 . } - // 6 . Decls: []ast.Decl (len = 1) { - // 7 . . 0: *ast.FuncDecl { - // 8 . . . Name: *ast.Ident { - // 9 . . . . NamePos: 3:6 - // 10 . . . . Name: "main" - // 11 . . . . Obj: *ast.Object { - // 12 . . . . . Kind: func - // 13 . . . . . Name: "main" - // 14 . . . . . Decl: *(obj @ 7) - // 15 . . . . } - // 16 . . . } - // 17 . . . Type: *ast.FuncType { - // 18 . . . . Func: 3:1 - // 19 . . . . Params: *ast.FieldList { - // 20 . . . . . Opening: 3:10 - // 21 . . . . . Closing: 3:11 - // 22 . . . . } - // 23 . . . } - // 24 . . . Body: *ast.BlockStmt { - // 25 . . . . Lbrace: 3:13 - // 26 . . . . List: []ast.Stmt (len = 1) { - // 27 . . . . . 0: *ast.ExprStmt { - // 28 . . . . . . X: *ast.CallExpr { - // 29 . . . . . . . Fun: *ast.Ident { - // 30 . . . . . . . . NamePos: 4:2 - // 31 . . . . . . . . Name: "println" - // 32 . . . . . . . } - // 33 . . . . . . . Lparen: 4:9 - // 34 . . . . . . . Args: []ast.Expr (len = 1) { - // 35 . . . . . . . . 0: *ast.BasicLit { - // 36 . . . . . . . . . ValuePos: 4:10 - // 37 . . . . . . . . . Kind: STRING - // 38 . . . . . . . . . Value: "\"Hello, World!\"" - // 39 . . . . . . . . } - // 40 . . . . . . . } - // 41 . . . . . . . Ellipsis: - - // 42 . . . . . . . Rparen: 4:25 - // 43 . . . . . . } - // 44 . . . . . } - // 45 . . . . } - // 46 . . . . Rbrace: 5:1 - // 47 . . . } - // 48 . . } - // 49 . } - // 50 . Scope: *ast.Scope { - // 51 . . Objects: map[string]*ast.Object (len = 1) { - // 52 . . . "main": *(obj @ 11) - // 53 . . } - // 54 . } - // 55 . Unresolved: []*ast.Ident (len = 1) { - // 56 . . 0: *(obj @ 29) - // 57 . } - // 58 } -} - -// This example illustrates how to remove a variable declaration -// in a Go program while maintaining correct comment association -// using an ast.CommentMap. -func ExampleCommentMap() { - // src is the input for which we create the AST that we - // are going to manipulate. - src := ` -// This is the package comment. -package main - -// This comment is associated with the hello constant. -const hello = "Hello, World!" // line comment 1 - -// This comment is associated with the foo variable. -var foo = hello // line comment 2 - -// This comment is associated with the main function. -func main() { - fmt.Println(hello) // line comment 3 -} -` - - // Create the AST by parsing src. - fset := token.NewFileSet() // positions are relative to fset - f, err := parser.ParseFile(fset, "src.go", src, parser.ParseComments) - if err != nil { - panic(err) - } - - // Create an ast.CommentMap from the ast.File's comments. - // This helps keeping the association between comments - // and AST nodes. - cmap := ast.NewCommentMap(fset, f, f.Comments) - - // Remove the first variable declaration from the list of declarations. - for i, decl := range f.Decls { - if gen, ok := decl.(*ast.GenDecl); ok && gen.Tok == token.VAR { - copy(f.Decls[i:], f.Decls[i+1:]) - f.Decls = f.Decls[:len(f.Decls)-1] - break - } - } - - // Use the comment map to filter comments that don't belong anymore - // (the comments associated with the variable declaration), and create - // the new comments list. - f.Comments = cmap.Filter(f).Comments() - - // Print the modified AST. - var buf bytes.Buffer - if err := format.Node(&buf, fset, f); err != nil { - panic(err) - } - fmt.Printf("%s", buf.Bytes()) - - // Output: - // // This is the package comment. - // package main - // - // // This comment is associated with the hello constant. - // const hello = "Hello, World!" // line comment 1 - // - // // This comment is associated with the main function. - // func main() { - // fmt.Println(hello) // line comment 3 - // } -} diff --git a/internal/backport/go/ast/filter.go b/internal/backport/go/ast/filter.go deleted file mode 100644 index 8c2ed9d267..0000000000 --- a/internal/backport/go/ast/filter.go +++ /dev/null @@ -1,488 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast - -import ( - "golang.org/x/website/internal/backport/go/token" - "sort" -) - -// ---------------------------------------------------------------------------- -// Export filtering - -// exportFilter is a special filter function to extract exported nodes. -func exportFilter(name string) bool { - return IsExported(name) -} - -// FileExports trims the AST for a Go source file in place such that -// only exported nodes remain: all top-level identifiers which are not exported -// and their associated information (such as type, initial value, or function -// body) are removed. Non-exported fields and methods of exported types are -// stripped. The File.Comments list is not changed. -// -// FileExports reports whether there are exported declarations. -func FileExports(src *File) bool { - return filterFile(src, exportFilter, true) -} - -// PackageExports trims the AST for a Go package in place such that -// only exported nodes remain. The pkg.Files list is not changed, so that -// file names and top-level package comments don't get lost. -// -// PackageExports reports whether there are exported declarations; -// it returns false otherwise. -func PackageExports(pkg *Package) bool { - return filterPackage(pkg, exportFilter, true) -} - -// ---------------------------------------------------------------------------- -// General filtering - -type Filter func(string) bool - -func filterIdentList(list []*Ident, f Filter) []*Ident { - j := 0 - for _, x := range list { - if f(x.Name) { - list[j] = x - j++ - } - } - return list[0:j] -} - -// fieldName assumes that x is the type of an anonymous field and -// returns the corresponding field name. If x is not an acceptable -// anonymous field, the result is nil. -func fieldName(x Expr) *Ident { - switch t := x.(type) { - case *Ident: - return t - case *SelectorExpr: - if _, ok := t.X.(*Ident); ok { - return t.Sel - } - case *StarExpr: - return fieldName(t.X) - } - return nil -} - -func filterFieldList(fields *FieldList, filter Filter, export bool) (removedFields bool) { - if fields == nil { - return false - } - list := fields.List - j := 0 - for _, f := range list { - keepField := false - if len(f.Names) == 0 { - // anonymous field - name := fieldName(f.Type) - keepField = name != nil && filter(name.Name) - } else { - n := len(f.Names) - f.Names = filterIdentList(f.Names, filter) - if len(f.Names) < n { - removedFields = true - } - keepField = len(f.Names) > 0 - } - if keepField { - if export { - filterType(f.Type, filter, export) - } - list[j] = f - j++ - } - } - if j < len(list) { - removedFields = true - } - fields.List = list[0:j] - return -} - -func filterCompositeLit(lit *CompositeLit, filter Filter, export bool) { - n := len(lit.Elts) - lit.Elts = filterExprList(lit.Elts, filter, export) - if len(lit.Elts) < n { - lit.Incomplete = true - } -} - -func filterExprList(list []Expr, filter Filter, export bool) []Expr { - j := 0 - for _, exp := range list { - switch x := exp.(type) { - case *CompositeLit: - filterCompositeLit(x, filter, export) - case *KeyValueExpr: - if x, ok := x.Key.(*Ident); ok && !filter(x.Name) { - continue - } - if x, ok := x.Value.(*CompositeLit); ok { - filterCompositeLit(x, filter, export) - } - } - list[j] = exp - j++ - } - return list[0:j] -} - -func filterParamList(fields *FieldList, filter Filter, export bool) bool { - if fields == nil { - return false - } - var b bool - for _, f := range fields.List { - if filterType(f.Type, filter, export) { - b = true - } - } - return b -} - -func filterType(typ Expr, f Filter, export bool) bool { - switch t := typ.(type) { - case *Ident: - return f(t.Name) - case *ParenExpr: - return filterType(t.X, f, export) - case *ArrayType: - return filterType(t.Elt, f, export) - case *StructType: - if filterFieldList(t.Fields, f, export) { - t.Incomplete = true - } - return len(t.Fields.List) > 0 - case *FuncType: - b1 := filterParamList(t.Params, f, export) - b2 := filterParamList(t.Results, f, export) - return b1 || b2 - case *InterfaceType: - if filterFieldList(t.Methods, f, export) { - t.Incomplete = true - } - return len(t.Methods.List) > 0 - case *MapType: - b1 := filterType(t.Key, f, export) - b2 := filterType(t.Value, f, export) - return b1 || b2 - case *ChanType: - return filterType(t.Value, f, export) - } - return false -} - -func filterSpec(spec Spec, f Filter, export bool) bool { - switch s := spec.(type) { - case *ValueSpec: - s.Names = filterIdentList(s.Names, f) - s.Values = filterExprList(s.Values, f, export) - if len(s.Names) > 0 { - if export { - filterType(s.Type, f, export) - } - return true - } - case *TypeSpec: - if f(s.Name.Name) { - if export { - filterType(s.Type, f, export) - } - return true - } - if !export { - // For general filtering (not just exports), - // filter type even if name is not filtered - // out. - // If the type contains filtered elements, - // keep the declaration. - return filterType(s.Type, f, export) - } - } - return false -} - -func filterSpecList(list []Spec, f Filter, export bool) []Spec { - j := 0 - for _, s := range list { - if filterSpec(s, f, export) { - list[j] = s - j++ - } - } - return list[0:j] -} - -// FilterDecl trims the AST for a Go declaration in place by removing -// all names (including struct field and interface method names, but -// not from parameter lists) that don't pass through the filter f. -// -// FilterDecl reports whether there are any declared names left after -// filtering. -func FilterDecl(decl Decl, f Filter) bool { - return filterDecl(decl, f, false) -} - -func filterDecl(decl Decl, f Filter, export bool) bool { - switch d := decl.(type) { - case *GenDecl: - d.Specs = filterSpecList(d.Specs, f, export) - return len(d.Specs) > 0 - case *FuncDecl: - return f(d.Name.Name) - } - return false -} - -// FilterFile trims the AST for a Go file in place by removing all -// names from top-level declarations (including struct field and -// interface method names, but not from parameter lists) that don't -// pass through the filter f. If the declaration is empty afterwards, -// the declaration is removed from the AST. Import declarations are -// always removed. The File.Comments list is not changed. -// -// FilterFile reports whether there are any top-level declarations -// left after filtering. -func FilterFile(src *File, f Filter) bool { - return filterFile(src, f, false) -} - -func filterFile(src *File, f Filter, export bool) bool { - j := 0 - for _, d := range src.Decls { - if filterDecl(d, f, export) { - src.Decls[j] = d - j++ - } - } - src.Decls = src.Decls[0:j] - return j > 0 -} - -// FilterPackage trims the AST for a Go package in place by removing -// all names from top-level declarations (including struct field and -// interface method names, but not from parameter lists) that don't -// pass through the filter f. If the declaration is empty afterwards, -// the declaration is removed from the AST. The pkg.Files list is not -// changed, so that file names and top-level package comments don't get -// lost. -// -// FilterPackage reports whether there are any top-level declarations -// left after filtering. -func FilterPackage(pkg *Package, f Filter) bool { - return filterPackage(pkg, f, false) -} - -func filterPackage(pkg *Package, f Filter, export bool) bool { - hasDecls := false - for _, src := range pkg.Files { - if filterFile(src, f, export) { - hasDecls = true - } - } - return hasDecls -} - -// ---------------------------------------------------------------------------- -// Merging of package files - -// The MergeMode flags control the behavior of MergePackageFiles. -type MergeMode uint - -const ( - // If set, duplicate function declarations are excluded. - FilterFuncDuplicates MergeMode = 1 << iota - // If set, comments that are not associated with a specific - // AST node (as Doc or Comment) are excluded. - FilterUnassociatedComments - // If set, duplicate import declarations are excluded. - FilterImportDuplicates -) - -// nameOf returns the function (foo) or method name (foo.bar) for -// the given function declaration. If the AST is incorrect for the -// receiver, it assumes a function instead. -func nameOf(f *FuncDecl) string { - if r := f.Recv; r != nil && len(r.List) == 1 { - // looks like a correct receiver declaration - t := r.List[0].Type - // dereference pointer receiver types - if p, _ := t.(*StarExpr); p != nil { - t = p.X - } - // the receiver type must be a type name - if p, _ := t.(*Ident); p != nil { - return p.Name + "." + f.Name.Name - } - // otherwise assume a function instead - } - return f.Name.Name -} - -// separator is an empty //-style comment that is interspersed between -// different comment groups when they are concatenated into a single group -var separator = &Comment{token.NoPos, "//"} - -// MergePackageFiles creates a file AST by merging the ASTs of the -// files belonging to a package. The mode flags control merging behavior. -func MergePackageFiles(pkg *Package, mode MergeMode) *File { - // Count the number of package docs, comments and declarations across - // all package files. Also, compute sorted list of filenames, so that - // subsequent iterations can always iterate in the same order. - ndocs := 0 - ncomments := 0 - ndecls := 0 - filenames := make([]string, len(pkg.Files)) - i := 0 - for filename, f := range pkg.Files { - filenames[i] = filename - i++ - if f.Doc != nil { - ndocs += len(f.Doc.List) + 1 // +1 for separator - } - ncomments += len(f.Comments) - ndecls += len(f.Decls) - } - sort.Strings(filenames) - - // Collect package comments from all package files into a single - // CommentGroup - the collected package documentation. In general - // there should be only one file with a package comment; but it's - // better to collect extra comments than drop them on the floor. - var doc *CommentGroup - var pos token.Pos - if ndocs > 0 { - list := make([]*Comment, ndocs-1) // -1: no separator before first group - i := 0 - for _, filename := range filenames { - f := pkg.Files[filename] - if f.Doc != nil { - if i > 0 { - // not the first group - add separator - list[i] = separator - i++ - } - for _, c := range f.Doc.List { - list[i] = c - i++ - } - if f.Package > pos { - // Keep the maximum package clause position as - // position for the package clause of the merged - // files. - pos = f.Package - } - } - } - doc = &CommentGroup{list} - } - - // Collect declarations from all package files. - var decls []Decl - if ndecls > 0 { - decls = make([]Decl, ndecls) - funcs := make(map[string]int) // map of func name -> decls index - i := 0 // current index - n := 0 // number of filtered entries - for _, filename := range filenames { - f := pkg.Files[filename] - for _, d := range f.Decls { - if mode&FilterFuncDuplicates != 0 { - // A language entity may be declared multiple - // times in different package files; only at - // build time declarations must be unique. - // For now, exclude multiple declarations of - // functions - keep the one with documentation. - // - // TODO(gri): Expand this filtering to other - // entities (const, type, vars) if - // multiple declarations are common. - if f, isFun := d.(*FuncDecl); isFun { - name := nameOf(f) - if j, exists := funcs[name]; exists { - // function declared already - if decls[j] != nil && decls[j].(*FuncDecl).Doc == nil { - // existing declaration has no documentation; - // ignore the existing declaration - decls[j] = nil - } else { - // ignore the new declaration - d = nil - } - n++ // filtered an entry - } else { - funcs[name] = i - } - } - } - decls[i] = d - i++ - } - } - - // Eliminate nil entries from the decls list if entries were - // filtered. We do this using a 2nd pass in order to not disturb - // the original declaration order in the source (otherwise, this - // would also invalidate the monotonically increasing position - // info within a single file). - if n > 0 { - i = 0 - for _, d := range decls { - if d != nil { - decls[i] = d - i++ - } - } - decls = decls[0:i] - } - } - - // Collect import specs from all package files. - var imports []*ImportSpec - if mode&FilterImportDuplicates != 0 { - seen := make(map[string]bool) - for _, filename := range filenames { - f := pkg.Files[filename] - for _, imp := range f.Imports { - if path := imp.Path.Value; !seen[path] { - // TODO: consider handling cases where: - // - 2 imports exist with the same import path but - // have different local names (one should probably - // keep both of them) - // - 2 imports exist but only one has a comment - // - 2 imports exist and they both have (possibly - // different) comments - imports = append(imports, imp) - seen[path] = true - } - } - } - } else { - // Iterate over filenames for deterministic order. - for _, filename := range filenames { - f := pkg.Files[filename] - imports = append(imports, f.Imports...) - } - } - - // Collect comments from all package files. - var comments []*CommentGroup - if mode&FilterUnassociatedComments == 0 { - comments = make([]*CommentGroup, ncomments) - i := 0 - for _, filename := range filenames { - f := pkg.Files[filename] - i += copy(comments[i:], f.Comments) - } - } - - // TODO(gri) need to compute unresolved identifiers! - return &File{doc, pos, NewIdent(pkg.Name), decls, pkg.Scope, imports, nil, comments} -} diff --git a/internal/backport/go/ast/filter_test.go b/internal/backport/go/ast/filter_test.go deleted file mode 100644 index fa5da6a1ab..0000000000 --- a/internal/backport/go/ast/filter_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// To avoid a cyclic dependency with go/parser, this file is in a separate package. - -package ast_test - -import ( - "bytes" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/format" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" - "testing" -) - -const input = `package p - -type t1 struct{} -type t2 struct{} - -func f1() {} -func f1() {} -func f2() {} - -func (*t1) f1() {} -func (t1) f1() {} -func (t1) f2() {} - -func (t2) f1() {} -func (t2) f2() {} -func (x *t2) f2() {} -` - -// Calling ast.MergePackageFiles with ast.FilterFuncDuplicates -// keeps a duplicate entry with attached documentation in favor -// of one without, and it favors duplicate entries appearing -// later in the source over ones appearing earlier. This is why -// (*t2).f2 is kept and t2.f2 is eliminated in this test case. -const golden = `package p - -type t1 struct{} -type t2 struct{} - -func f1() {} -func f2() {} - -func (t1) f1() {} -func (t1) f2() {} - -func (t2) f1() {} - -func (x *t2) f2() {} -` - -func TestFilterDuplicates(t *testing.T) { - // parse input - fset := token.NewFileSet() - file, err := parser.ParseFile(fset, "", input, 0) - if err != nil { - t.Fatal(err) - } - - // create package - files := map[string]*ast.File{"": file} - pkg, err := ast.NewPackage(fset, files, nil, nil) - if err != nil { - t.Fatal(err) - } - - // filter - merged := ast.MergePackageFiles(pkg, ast.FilterFuncDuplicates) - - // pretty-print - var buf bytes.Buffer - if err := format.Node(&buf, fset, merged); err != nil { - t.Fatal(err) - } - output := buf.String() - - if output != golden { - t.Errorf("incorrect output:\n%s", output) - } -} diff --git a/internal/backport/go/ast/import.go b/internal/backport/go/ast/import.go deleted file mode 100644 index 7c70ef6696..0000000000 --- a/internal/backport/go/ast/import.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast - -import ( - "golang.org/x/website/internal/backport/go/token" - "sort" - "strconv" -) - -// SortImports sorts runs of consecutive import lines in import blocks in f. -// It also removes duplicate imports when it is possible to do so without data loss. -func SortImports(fset *token.FileSet, f *File) { - for _, d := range f.Decls { - d, ok := d.(*GenDecl) - if !ok || d.Tok != token.IMPORT { - // Not an import declaration, so we're done. - // Imports are always first. - break - } - - if !d.Lparen.IsValid() { - // Not a block: sorted by default. - continue - } - - // Identify and sort runs of specs on successive lines. - i := 0 - specs := d.Specs[:0] - for j, s := range d.Specs { - if j > i && lineAt(fset, s.Pos()) > 1+lineAt(fset, d.Specs[j-1].End()) { - // j begins a new run. End this one. - specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...) - i = j - } - } - specs = append(specs, sortSpecs(fset, f, d.Specs[i:])...) - d.Specs = specs - - // Deduping can leave a blank line before the rparen; clean that up. - if len(d.Specs) > 0 { - lastSpec := d.Specs[len(d.Specs)-1] - lastLine := lineAt(fset, lastSpec.Pos()) - rParenLine := lineAt(fset, d.Rparen) - for rParenLine > lastLine+1 { - rParenLine-- - fset.File(d.Rparen).MergeLine(rParenLine) - } - } - } -} - -func lineAt(fset *token.FileSet, pos token.Pos) int { - return fset.PositionFor(pos, false).Line -} - -func importPath(s Spec) string { - t, err := strconv.Unquote(s.(*ImportSpec).Path.Value) - if err == nil { - return t - } - return "" -} - -func importName(s Spec) string { - n := s.(*ImportSpec).Name - if n == nil { - return "" - } - return n.Name -} - -func importComment(s Spec) string { - c := s.(*ImportSpec).Comment - if c == nil { - return "" - } - return c.Text() -} - -// collapse indicates whether prev may be removed, leaving only next. -func collapse(prev, next Spec) bool { - if importPath(next) != importPath(prev) || importName(next) != importName(prev) { - return false - } - return prev.(*ImportSpec).Comment == nil -} - -type posSpan struct { - Start token.Pos - End token.Pos -} - -type cgPos struct { - left bool // true if comment is to the left of the spec, false otherwise. - cg *CommentGroup -} - -func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { - // Can't short-circuit here even if specs are already sorted, - // since they might yet need deduplication. - // A lone import, however, may be safely ignored. - if len(specs) <= 1 { - return specs - } - - // Record positions for specs. - pos := make([]posSpan, len(specs)) - for i, s := range specs { - pos[i] = posSpan{s.Pos(), s.End()} - } - - // Identify comments in this range. - begSpecs := pos[0].Start - endSpecs := pos[len(pos)-1].End - beg := fset.File(begSpecs).LineStart(lineAt(fset, begSpecs)) - endLine := lineAt(fset, endSpecs) - endFile := fset.File(endSpecs) - var end token.Pos - if endLine == endFile.LineCount() { - end = endSpecs - } else { - end = endFile.LineStart(endLine + 1) // beginning of next line - } - first := len(f.Comments) - last := -1 - for i, g := range f.Comments { - if g.End() >= end { - break - } - // g.End() < end - if beg <= g.Pos() { - // comment is within the range [beg, end[ of import declarations - if i < first { - first = i - } - if i > last { - last = i - } - } - } - - var comments []*CommentGroup - if last >= 0 { - comments = f.Comments[first : last+1] - } - - // Assign each comment to the import spec on the same line. - importComments := map[*ImportSpec][]cgPos{} - specIndex := 0 - for _, g := range comments { - for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() { - specIndex++ - } - var left bool - // A block comment can appear before the first import spec. - if specIndex == 0 && pos[specIndex].Start > g.Pos() { - left = true - } else if specIndex+1 < len(specs) && // Or it can appear on the left of an import spec. - lineAt(fset, pos[specIndex].Start)+1 == lineAt(fset, g.Pos()) { - specIndex++ - left = true - } - s := specs[specIndex].(*ImportSpec) - importComments[s] = append(importComments[s], cgPos{left: left, cg: g}) - } - - // Sort the import specs by import path. - // Remove duplicates, when possible without data loss. - // Reassign the import paths to have the same position sequence. - // Reassign each comment to the spec on the same line. - // Sort the comments by new position. - sort.Slice(specs, func(i, j int) bool { - ipath := importPath(specs[i]) - jpath := importPath(specs[j]) - if ipath != jpath { - return ipath < jpath - } - iname := importName(specs[i]) - jname := importName(specs[j]) - if iname != jname { - return iname < jname - } - return importComment(specs[i]) < importComment(specs[j]) - }) - - // Dedup. Thanks to our sorting, we can just consider - // adjacent pairs of imports. - deduped := specs[:0] - for i, s := range specs { - if i == len(specs)-1 || !collapse(s, specs[i+1]) { - deduped = append(deduped, s) - } else { - p := s.Pos() - fset.File(p).MergeLine(lineAt(fset, p)) - } - } - specs = deduped - - // Fix up comment positions - for i, s := range specs { - s := s.(*ImportSpec) - if s.Name != nil { - s.Name.NamePos = pos[i].Start - } - s.Path.ValuePos = pos[i].Start - s.EndPos = pos[i].End - for _, g := range importComments[s] { - for _, c := range g.cg.List { - if g.left { - c.Slash = pos[i].Start - 1 - } else { - // An import spec can have both block comment and a line comment - // to its right. In that case, both of them will have the same pos. - // But while formatting the AST, the line comment gets moved to - // after the block comment. - c.Slash = pos[i].End - } - } - } - } - - sort.Slice(comments, func(i, j int) bool { - return comments[i].Pos() < comments[j].Pos() - }) - - return specs -} diff --git a/internal/backport/go/ast/issues_test.go b/internal/backport/go/ast/issues_test.go deleted file mode 100644 index 3fb32053af..0000000000 --- a/internal/backport/go/ast/issues_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast_test - -import ( - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" - "testing" -) - -func TestIssue33649(t *testing.T) { - for _, src := range []string{ - `package p; func _()`, - `package p; func _() {`, - `package p; func _() { _ = 0`, - `package p; func _() { _ = 0 }`, - } { - fset := token.NewFileSet() - f, _ := parser.ParseFile(fset, "", src, parser.AllErrors) - if f == nil { - panic("invalid test setup: parser didn't return an AST") - } - - // find corresponding token.File - var tf *token.File - fset.Iterate(func(f *token.File) bool { - tf = f - return true - }) - tfEnd := tf.Base() + tf.Size() - - fd := f.Decls[len(f.Decls)-1].(*ast.FuncDecl) - fdEnd := int(fd.End()) - - if fdEnd != tfEnd { - t.Errorf("%q: got fdEnd = %d; want %d (base = %d, size = %d)", src, fdEnd, tfEnd, tf.Base(), tf.Size()) - } - } -} diff --git a/internal/backport/go/ast/print.go b/internal/backport/go/ast/print.go deleted file mode 100644 index 16ce365122..0000000000 --- a/internal/backport/go/ast/print.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains printing support for ASTs. - -package ast - -import ( - "fmt" - "io" - "os" - "reflect" - - "golang.org/x/website/internal/backport/go/token" -) - -// A FieldFilter may be provided to Fprint to control the output. -type FieldFilter func(name string, value reflect.Value) bool - -// NotNilFilter returns true for field values that are not nil; -// it returns false otherwise. -func NotNilFilter(_ string, v reflect.Value) bool { - switch v.Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return !v.IsNil() - } - return true -} - -// Fprint prints the (sub-)tree starting at AST node x to w. -// If fset != nil, position information is interpreted relative -// to that file set. Otherwise positions are printed as integer -// values (file set specific offsets). -// -// A non-nil FieldFilter f may be provided to control the output: -// struct fields for which f(fieldname, fieldvalue) is true are -// printed; all others are filtered from the output. Unexported -// struct fields are never printed. -func Fprint(w io.Writer, fset *token.FileSet, x interface{}, f FieldFilter) error { - return fprint(w, fset, x, f) -} - -func fprint(w io.Writer, fset *token.FileSet, x interface{}, f FieldFilter) (err error) { - // setup printer - p := printer{ - output: w, - fset: fset, - filter: f, - ptrmap: make(map[interface{}]int), - last: '\n', // force printing of line number on first line - } - - // install error handler - defer func() { - if e := recover(); e != nil { - err = e.(localError).err // re-panics if it's not a localError - } - }() - - // print x - if x == nil { - p.printf("nil\n") - return - } - p.print(reflect.ValueOf(x)) - p.printf("\n") - - return -} - -// Print prints x to standard output, skipping nil fields. -// Print(fset, x) is the same as Fprint(os.Stdout, fset, x, NotNilFilter). -func Print(fset *token.FileSet, x interface{}) error { - return Fprint(os.Stdout, fset, x, NotNilFilter) -} - -type printer struct { - output io.Writer - fset *token.FileSet - filter FieldFilter - ptrmap map[interface{}]int // *T -> line number - indent int // current indentation level - last byte // the last byte processed by Write - line int // current line number -} - -var indent = []byte(". ") - -func (p *printer) Write(data []byte) (n int, err error) { - var m int - for i, b := range data { - // invariant: data[0:n] has been written - if b == '\n' { - m, err = p.output.Write(data[n : i+1]) - n += m - if err != nil { - return - } - p.line++ - } else if p.last == '\n' { - _, err = fmt.Fprintf(p.output, "%6d ", p.line) - if err != nil { - return - } - for j := p.indent; j > 0; j-- { - _, err = p.output.Write(indent) - if err != nil { - return - } - } - } - p.last = b - } - if len(data) > n { - m, err = p.output.Write(data[n:]) - n += m - } - return -} - -// localError wraps locally caught errors so we can distinguish -// them from genuine panics which we don't want to return as errors. -type localError struct { - err error -} - -// printf is a convenience wrapper that takes care of print errors. -func (p *printer) printf(format string, args ...interface{}) { - if _, err := fmt.Fprintf(p, format, args...); err != nil { - panic(localError{err}) - } -} - -// Implementation note: Print is written for AST nodes but could be -// used to print arbitrary data structures; such a version should -// probably be in a different package. -// -// Note: This code detects (some) cycles created via pointers but -// not cycles that are created via slices or maps containing the -// same slice or map. Code for general data structures probably -// should catch those as well. - -func (p *printer) print(x reflect.Value) { - if !NotNilFilter("", x) { - p.printf("nil") - return - } - - switch x.Kind() { - case reflect.Interface: - p.print(x.Elem()) - - case reflect.Map: - p.printf("%s (len = %d) {", x.Type(), x.Len()) - if x.Len() > 0 { - p.indent++ - p.printf("\n") - for _, key := range x.MapKeys() { - p.print(key) - p.printf(": ") - p.print(x.MapIndex(key)) - p.printf("\n") - } - p.indent-- - } - p.printf("}") - - case reflect.Ptr: - p.printf("*") - // type-checked ASTs may contain cycles - use ptrmap - // to keep track of objects that have been printed - // already and print the respective line number instead - ptr := x.Interface() - if line, exists := p.ptrmap[ptr]; exists { - p.printf("(obj @ %d)", line) - } else { - p.ptrmap[ptr] = p.line - p.print(x.Elem()) - } - - case reflect.Array: - p.printf("%s {", x.Type()) - if x.Len() > 0 { - p.indent++ - p.printf("\n") - for i, n := 0, x.Len(); i < n; i++ { - p.printf("%d: ", i) - p.print(x.Index(i)) - p.printf("\n") - } - p.indent-- - } - p.printf("}") - - case reflect.Slice: - if s, ok := x.Interface().([]byte); ok { - p.printf("%#q", s) - return - } - p.printf("%s (len = %d) {", x.Type(), x.Len()) - if x.Len() > 0 { - p.indent++ - p.printf("\n") - for i, n := 0, x.Len(); i < n; i++ { - p.printf("%d: ", i) - p.print(x.Index(i)) - p.printf("\n") - } - p.indent-- - } - p.printf("}") - - case reflect.Struct: - t := x.Type() - p.printf("%s {", t) - p.indent++ - first := true - for i, n := 0, t.NumField(); i < n; i++ { - // exclude non-exported fields because their - // values cannot be accessed via reflection - if name := t.Field(i).Name; IsExported(name) { - value := x.Field(i) - if p.filter == nil || p.filter(name, value) { - if first { - p.printf("\n") - first = false - } - p.printf("%s: ", name) - p.print(value) - p.printf("\n") - } - } - } - p.indent-- - p.printf("}") - - default: - v := x.Interface() - switch v := v.(type) { - case string: - // print strings in quotes - p.printf("%q", v) - return - case token.Pos: - // position values can be printed nicely if we have a file set - if p.fset != nil { - p.printf("%s", p.fset.Position(v)) - return - } - } - // default - p.printf("%v", v) - } -} diff --git a/internal/backport/go/ast/print_test.go b/internal/backport/go/ast/print_test.go deleted file mode 100644 index 210f164301..0000000000 --- a/internal/backport/go/ast/print_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast - -import ( - "bytes" - "strings" - "testing" -) - -var tests = []struct { - x interface{} // x is printed as s - s string -}{ - // basic types - {nil, "0 nil"}, - {true, "0 true"}, - {42, "0 42"}, - {3.14, "0 3.14"}, - {1 + 2.718i, "0 (1+2.718i)"}, - {"foobar", "0 \"foobar\""}, - - // maps - {map[Expr]string{}, `0 map[ast.Expr]string (len = 0) {}`}, - {map[string]int{"a": 1}, - `0 map[string]int (len = 1) { - 1 . "a": 1 - 2 }`}, - - // pointers - {new(int), "0 *0"}, - - // arrays - {[0]int{}, `0 [0]int {}`}, - {[3]int{1, 2, 3}, - `0 [3]int { - 1 . 0: 1 - 2 . 1: 2 - 3 . 2: 3 - 4 }`}, - {[...]int{42}, - `0 [1]int { - 1 . 0: 42 - 2 }`}, - - // slices - {[]int{}, `0 []int (len = 0) {}`}, - {[]int{1, 2, 3}, - `0 []int (len = 3) { - 1 . 0: 1 - 2 . 1: 2 - 3 . 2: 3 - 4 }`}, - - // structs - {struct{}{}, `0 struct {} {}`}, - {struct{ x int }{007}, `0 struct { x int } {}`}, - {struct{ X, y int }{42, 991}, - `0 struct { X int; y int } { - 1 . X: 42 - 2 }`}, - {struct{ X, Y int }{42, 991}, - `0 struct { X int; Y int } { - 1 . X: 42 - 2 . Y: 991 - 3 }`}, -} - -// Split s into lines, trim whitespace from all lines, and return -// the concatenated non-empty lines. -func trim(s string) string { - lines := strings.Split(s, "\n") - i := 0 - for _, line := range lines { - line = strings.TrimSpace(line) - if line != "" { - lines[i] = line - i++ - } - } - return strings.Join(lines[0:i], "\n") -} - -func TestPrint(t *testing.T) { - var buf bytes.Buffer - for _, test := range tests { - buf.Reset() - if err := Fprint(&buf, nil, test.x, nil); err != nil { - t.Errorf("Fprint failed: %s", err) - } - if s, ts := trim(buf.String()), trim(test.s); s != ts { - t.Errorf("got:\n%s\nexpected:\n%s\n", s, ts) - } - } -} diff --git a/internal/backport/go/ast/resolve.go b/internal/backport/go/ast/resolve.go deleted file mode 100644 index 4d3d3fdc01..0000000000 --- a/internal/backport/go/ast/resolve.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements NewPackage. - -package ast - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/scanner" - "golang.org/x/website/internal/backport/go/token" - "strconv" -) - -type pkgBuilder struct { - fset *token.FileSet - errors scanner.ErrorList -} - -func (p *pkgBuilder) error(pos token.Pos, msg string) { - p.errors.Add(p.fset.Position(pos), msg) -} - -func (p *pkgBuilder) errorf(pos token.Pos, format string, args ...interface{}) { - p.error(pos, fmt.Sprintf(format, args...)) -} - -func (p *pkgBuilder) declare(scope, altScope *Scope, obj *Object) { - alt := scope.Insert(obj) - if alt == nil && altScope != nil { - // see if there is a conflicting declaration in altScope - alt = altScope.Lookup(obj.Name) - } - if alt != nil { - prevDecl := "" - if pos := alt.Pos(); pos.IsValid() { - prevDecl = fmt.Sprintf("\n\tprevious declaration at %s", p.fset.Position(pos)) - } - p.error(obj.Pos(), fmt.Sprintf("%s redeclared in this block%s", obj.Name, prevDecl)) - } -} - -func resolve(scope *Scope, ident *Ident) bool { - for ; scope != nil; scope = scope.Outer { - if obj := scope.Lookup(ident.Name); obj != nil { - ident.Obj = obj - return true - } - } - return false -} - -// An Importer resolves import paths to package Objects. -// The imports map records the packages already imported, -// indexed by package id (canonical import path). -// An Importer must determine the canonical import path and -// check the map to see if it is already present in the imports map. -// If so, the Importer can return the map entry. Otherwise, the -// Importer should load the package data for the given path into -// a new *Object (pkg), record pkg in the imports map, and then -// return pkg. -type Importer func(imports map[string]*Object, path string) (pkg *Object, err error) - -// NewPackage creates a new Package node from a set of File nodes. It resolves -// unresolved identifiers across files and updates each file's Unresolved list -// accordingly. If a non-nil importer and universe scope are provided, they are -// used to resolve identifiers not declared in any of the package files. Any -// remaining unresolved identifiers are reported as undeclared. If the files -// belong to different packages, one package name is selected and files with -// different package names are reported and then ignored. -// The result is a package node and a scanner.ErrorList if there were errors. -func NewPackage(fset *token.FileSet, files map[string]*File, importer Importer, universe *Scope) (*Package, error) { - var p pkgBuilder - p.fset = fset - - // complete package scope - pkgName := "" - pkgScope := NewScope(universe) - for _, file := range files { - // package names must match - switch name := file.Name.Name; { - case pkgName == "": - pkgName = name - case name != pkgName: - p.errorf(file.Package, "package %s; expected %s", name, pkgName) - continue // ignore this file - } - - // collect top-level file objects in package scope - for _, obj := range file.Scope.Objects { - p.declare(pkgScope, nil, obj) - } - } - - // package global mapping of imported package ids to package objects - imports := make(map[string]*Object) - - // complete file scopes with imports and resolve identifiers - for _, file := range files { - // ignore file if it belongs to a different package - // (error has already been reported) - if file.Name.Name != pkgName { - continue - } - - // build file scope by processing all imports - importErrors := false - fileScope := NewScope(pkgScope) - for _, spec := range file.Imports { - if importer == nil { - importErrors = true - continue - } - path, _ := strconv.Unquote(spec.Path.Value) - pkg, err := importer(imports, path) - if err != nil { - p.errorf(spec.Path.Pos(), "could not import %s (%s)", path, err) - importErrors = true - continue - } - // TODO(gri) If a local package name != "." is provided, - // global identifier resolution could proceed even if the - // import failed. Consider adjusting the logic here a bit. - - // local name overrides imported package name - name := pkg.Name - if spec.Name != nil { - name = spec.Name.Name - } - - // add import to file scope - if name == "." { - // merge imported scope with file scope - for _, obj := range pkg.Data.(*Scope).Objects { - p.declare(fileScope, pkgScope, obj) - } - } else if name != "_" { - // declare imported package object in file scope - // (do not re-use pkg in the file scope but create - // a new object instead; the Decl field is different - // for different files) - obj := NewObj(Pkg, name) - obj.Decl = spec - obj.Data = pkg.Data - p.declare(fileScope, pkgScope, obj) - } - } - - // resolve identifiers - if importErrors { - // don't use the universe scope without correct imports - // (objects in the universe may be shadowed by imports; - // with missing imports, identifiers might get resolved - // incorrectly to universe objects) - pkgScope.Outer = nil - } - i := 0 - for _, ident := range file.Unresolved { - if !resolve(fileScope, ident) { - p.errorf(ident.Pos(), "undeclared name: %s", ident.Name) - file.Unresolved[i] = ident - i++ - } - - } - file.Unresolved = file.Unresolved[0:i] - pkgScope.Outer = universe // reset universe scope - } - - p.errors.Sort() - return &Package{pkgName, pkgScope, imports, files}, p.errors.Err() -} diff --git a/internal/backport/go/ast/scope.go b/internal/backport/go/ast/scope.go deleted file mode 100644 index 165c9353f9..0000000000 --- a/internal/backport/go/ast/scope.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements scopes and the objects they contain. - -package ast - -import ( - "bytes" - "fmt" - "golang.org/x/website/internal/backport/go/token" -) - -// A Scope maintains the set of named language entities declared -// in the scope and a link to the immediately surrounding (outer) -// scope. -type Scope struct { - Outer *Scope - Objects map[string]*Object -} - -// NewScope creates a new scope nested in the outer scope. -func NewScope(outer *Scope) *Scope { - const n = 4 // initial scope capacity - return &Scope{outer, make(map[string]*Object, n)} -} - -// Lookup returns the object with the given name if it is -// found in scope s, otherwise it returns nil. Outer scopes -// are ignored. -func (s *Scope) Lookup(name string) *Object { - return s.Objects[name] -} - -// Insert attempts to insert a named object obj into the scope s. -// If the scope already contains an object alt with the same name, -// Insert leaves the scope unchanged and returns alt. Otherwise -// it inserts obj and returns nil. -func (s *Scope) Insert(obj *Object) (alt *Object) { - if alt = s.Objects[obj.Name]; alt == nil { - s.Objects[obj.Name] = obj - } - return -} - -// Debugging support -func (s *Scope) String() string { - var buf bytes.Buffer - fmt.Fprintf(&buf, "scope %p {", s) - if s != nil && len(s.Objects) > 0 { - fmt.Fprintln(&buf) - for _, obj := range s.Objects { - fmt.Fprintf(&buf, "\t%s %s\n", obj.Kind, obj.Name) - } - } - fmt.Fprintf(&buf, "}\n") - return buf.String() -} - -// ---------------------------------------------------------------------------- -// Objects - -// An Object describes a named language entity such as a package, -// constant, type, variable, function (incl. methods), or label. -// -// The Data fields contains object-specific data: -// -// Kind Data type Data value -// Pkg *Scope package scope -// Con int iota for the respective declaration -type Object struct { - Kind ObjKind - Name string // declared name - Decl interface{} // corresponding Field, XxxSpec, FuncDecl, LabeledStmt, AssignStmt, Scope; or nil - Data interface{} // object-specific data; or nil - Type interface{} // placeholder for type information; may be nil -} - -// NewObj creates a new object of a given kind and name. -func NewObj(kind ObjKind, name string) *Object { - return &Object{Kind: kind, Name: name} -} - -// Pos computes the source position of the declaration of an object name. -// The result may be an invalid position if it cannot be computed -// (obj.Decl may be nil or not correct). -func (obj *Object) Pos() token.Pos { - name := obj.Name - switch d := obj.Decl.(type) { - case *Field: - for _, n := range d.Names { - if n.Name == name { - return n.Pos() - } - } - case *ImportSpec: - if d.Name != nil && d.Name.Name == name { - return d.Name.Pos() - } - return d.Path.Pos() - case *ValueSpec: - for _, n := range d.Names { - if n.Name == name { - return n.Pos() - } - } - case *TypeSpec: - if d.Name.Name == name { - return d.Name.Pos() - } - case *FuncDecl: - if d.Name.Name == name { - return d.Name.Pos() - } - case *LabeledStmt: - if d.Label.Name == name { - return d.Label.Pos() - } - case *AssignStmt: - for _, x := range d.Lhs { - if ident, isIdent := x.(*Ident); isIdent && ident.Name == name { - return ident.Pos() - } - } - case *Scope: - // predeclared object - nothing to do for now - } - return token.NoPos -} - -// ObjKind describes what an object represents. -type ObjKind int - -// The list of possible Object kinds. -const ( - Bad ObjKind = iota // for error handling - Pkg // package - Con // constant - Typ // type - Var // variable - Fun // function or method - Lbl // label -) - -var objKindStrings = [...]string{ - Bad: "bad", - Pkg: "package", - Con: "const", - Typ: "type", - Var: "var", - Fun: "func", - Lbl: "label", -} - -func (kind ObjKind) String() string { return objKindStrings[kind] } diff --git a/internal/backport/go/ast/walk.go b/internal/backport/go/ast/walk.go deleted file mode 100644 index a293c99a10..0000000000 --- a/internal/backport/go/ast/walk.go +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ast - -import "fmt" - -// A Visitor's Visit method is invoked for each node encountered by Walk. -// If the result visitor w is not nil, Walk visits each of the children -// of node with the visitor w, followed by a call of w.Visit(nil). -type Visitor interface { - Visit(node Node) (w Visitor) -} - -// Helper functions for common node lists. They may be empty. - -func walkIdentList(v Visitor, list []*Ident) { - for _, x := range list { - Walk(v, x) - } -} - -func walkExprList(v Visitor, list []Expr) { - for _, x := range list { - Walk(v, x) - } -} - -func walkStmtList(v Visitor, list []Stmt) { - for _, x := range list { - Walk(v, x) - } -} - -func walkDeclList(v Visitor, list []Decl) { - for _, x := range list { - Walk(v, x) - } -} - -// TODO(gri): Investigate if providing a closure to Walk leads to -// simpler use (and may help eliminate Inspect in turn). - -// Walk traverses an AST in depth-first order: It starts by calling -// v.Visit(node); node must not be nil. If the visitor w returned by -// v.Visit(node) is not nil, Walk is invoked recursively with visitor -// w for each of the non-nil children of node, followed by a call of -// w.Visit(nil). -func Walk(v Visitor, node Node) { - if v = v.Visit(node); v == nil { - return - } - - // walk children - // (the order of the cases matches the order - // of the corresponding node types in ast.go) - switch n := node.(type) { - // Comments and fields - case *Comment: - // nothing to do - - case *CommentGroup: - for _, c := range n.List { - Walk(v, c) - } - - case *Field: - if n.Doc != nil { - Walk(v, n.Doc) - } - walkIdentList(v, n.Names) - if n.Type != nil { - Walk(v, n.Type) - } - if n.Tag != nil { - Walk(v, n.Tag) - } - if n.Comment != nil { - Walk(v, n.Comment) - } - - case *FieldList: - for _, f := range n.List { - Walk(v, f) - } - - // Expressions - case *BadExpr, *Ident, *BasicLit: - // nothing to do - - case *Ellipsis: - if n.Elt != nil { - Walk(v, n.Elt) - } - - case *FuncLit: - Walk(v, n.Type) - Walk(v, n.Body) - - case *CompositeLit: - if n.Type != nil { - Walk(v, n.Type) - } - walkExprList(v, n.Elts) - - case *ParenExpr: - Walk(v, n.X) - - case *SelectorExpr: - Walk(v, n.X) - Walk(v, n.Sel) - - case *IndexExpr: - Walk(v, n.X) - Walk(v, n.Index) - - case *IndexListExpr: - Walk(v, n.X) - for _, index := range n.Indices { - Walk(v, index) - } - - case *SliceExpr: - Walk(v, n.X) - if n.Low != nil { - Walk(v, n.Low) - } - if n.High != nil { - Walk(v, n.High) - } - if n.Max != nil { - Walk(v, n.Max) - } - - case *TypeAssertExpr: - Walk(v, n.X) - if n.Type != nil { - Walk(v, n.Type) - } - - case *CallExpr: - Walk(v, n.Fun) - walkExprList(v, n.Args) - - case *StarExpr: - Walk(v, n.X) - - case *UnaryExpr: - Walk(v, n.X) - - case *BinaryExpr: - Walk(v, n.X) - Walk(v, n.Y) - - case *KeyValueExpr: - Walk(v, n.Key) - Walk(v, n.Value) - - // Types - case *ArrayType: - if n.Len != nil { - Walk(v, n.Len) - } - Walk(v, n.Elt) - - case *StructType: - Walk(v, n.Fields) - - case *FuncType: - if n.TypeParams != nil { - Walk(v, n.TypeParams) - } - if n.Params != nil { - Walk(v, n.Params) - } - if n.Results != nil { - Walk(v, n.Results) - } - - case *InterfaceType: - Walk(v, n.Methods) - - case *MapType: - Walk(v, n.Key) - Walk(v, n.Value) - - case *ChanType: - Walk(v, n.Value) - - // Statements - case *BadStmt: - // nothing to do - - case *DeclStmt: - Walk(v, n.Decl) - - case *EmptyStmt: - // nothing to do - - case *LabeledStmt: - Walk(v, n.Label) - Walk(v, n.Stmt) - - case *ExprStmt: - Walk(v, n.X) - - case *SendStmt: - Walk(v, n.Chan) - Walk(v, n.Value) - - case *IncDecStmt: - Walk(v, n.X) - - case *AssignStmt: - walkExprList(v, n.Lhs) - walkExprList(v, n.Rhs) - - case *GoStmt: - Walk(v, n.Call) - - case *DeferStmt: - Walk(v, n.Call) - - case *ReturnStmt: - walkExprList(v, n.Results) - - case *BranchStmt: - if n.Label != nil { - Walk(v, n.Label) - } - - case *BlockStmt: - walkStmtList(v, n.List) - - case *IfStmt: - if n.Init != nil { - Walk(v, n.Init) - } - Walk(v, n.Cond) - Walk(v, n.Body) - if n.Else != nil { - Walk(v, n.Else) - } - - case *CaseClause: - walkExprList(v, n.List) - walkStmtList(v, n.Body) - - case *SwitchStmt: - if n.Init != nil { - Walk(v, n.Init) - } - if n.Tag != nil { - Walk(v, n.Tag) - } - Walk(v, n.Body) - - case *TypeSwitchStmt: - if n.Init != nil { - Walk(v, n.Init) - } - Walk(v, n.Assign) - Walk(v, n.Body) - - case *CommClause: - if n.Comm != nil { - Walk(v, n.Comm) - } - walkStmtList(v, n.Body) - - case *SelectStmt: - Walk(v, n.Body) - - case *ForStmt: - if n.Init != nil { - Walk(v, n.Init) - } - if n.Cond != nil { - Walk(v, n.Cond) - } - if n.Post != nil { - Walk(v, n.Post) - } - Walk(v, n.Body) - - case *RangeStmt: - if n.Key != nil { - Walk(v, n.Key) - } - if n.Value != nil { - Walk(v, n.Value) - } - Walk(v, n.X) - Walk(v, n.Body) - - // Declarations - case *ImportSpec: - if n.Doc != nil { - Walk(v, n.Doc) - } - if n.Name != nil { - Walk(v, n.Name) - } - Walk(v, n.Path) - if n.Comment != nil { - Walk(v, n.Comment) - } - - case *ValueSpec: - if n.Doc != nil { - Walk(v, n.Doc) - } - walkIdentList(v, n.Names) - if n.Type != nil { - Walk(v, n.Type) - } - walkExprList(v, n.Values) - if n.Comment != nil { - Walk(v, n.Comment) - } - - case *TypeSpec: - if n.Doc != nil { - Walk(v, n.Doc) - } - Walk(v, n.Name) - if n.TypeParams != nil { - Walk(v, n.TypeParams) - } - Walk(v, n.Type) - if n.Comment != nil { - Walk(v, n.Comment) - } - - case *BadDecl: - // nothing to do - - case *GenDecl: - if n.Doc != nil { - Walk(v, n.Doc) - } - for _, s := range n.Specs { - Walk(v, s) - } - - case *FuncDecl: - if n.Doc != nil { - Walk(v, n.Doc) - } - if n.Recv != nil { - Walk(v, n.Recv) - } - Walk(v, n.Name) - Walk(v, n.Type) - if n.Body != nil { - Walk(v, n.Body) - } - - // Files and packages - case *File: - if n.Doc != nil { - Walk(v, n.Doc) - } - Walk(v, n.Name) - walkDeclList(v, n.Decls) - // don't walk n.Comments - they have been - // visited already through the individual - // nodes - - case *Package: - for _, f := range n.Files { - Walk(v, f) - } - - default: - panic(fmt.Sprintf("ast.Walk: unexpected node type %T", n)) - } - - v.Visit(nil) -} - -type inspector func(Node) bool - -func (f inspector) Visit(node Node) Visitor { - if f(node) { - return f - } - return nil -} - -// Inspect traverses an AST in depth-first order: It starts by calling -// f(node); node must not be nil. If f returns true, Inspect invokes f -// recursively for each of the non-nil children of node, followed by a -// call of f(nil). -func Inspect(node Node, f func(Node) bool) { - Walk(inspector(f), node) -} diff --git a/internal/backport/go/build/build.go b/internal/backport/go/build/build.go deleted file mode 100644 index 01aab3cb8d..0000000000 --- a/internal/backport/go/build/build.go +++ /dev/null @@ -1,1970 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "bytes" - "errors" - "fmt" - "go/build" - "go/build/constraint" - "golang.org/x/website/internal/backport/go/doc" - "io" - "io/fs" - "io/ioutil" - "os" - "os/exec" - pathpkg "path" - "path/filepath" - "runtime" - "sort" - "strconv" - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" -) - -// A Context specifies the supporting context for a build. -type Context struct { - GOARCH string // target architecture - GOOS string // target operating system - GOROOT string // Go root - GOPATH string // Go path - - // Dir is the caller's working directory, or the empty string to use - // the current directory of the running process. In module mode, this is used - // to locate the main module. - // - // If Dir is non-empty, directories passed to Import and ImportDir must - // be absolute. - Dir string - - CgoEnabled bool // whether cgo files are included - UseAllFiles bool // use files regardless of +build lines, file names - Compiler string // compiler to assume when computing target paths - - // The build, tool, and release tags specify build constraints - // that should be considered satisfied when processing +build lines. - // Clients creating a new context may customize BuildTags, which - // defaults to empty, but it is usually an error to customize ToolTags or ReleaseTags. - // ToolTags defaults to build tags appropriate to the current Go toolchain configuration. - // ReleaseTags defaults to the list of Go releases the current release is compatible with. - // BuildTags is not set for the Default build Context. - // In addition to the BuildTags, ToolTags, and ReleaseTags, build constraints - // consider the values of GOARCH and GOOS as satisfied tags. - // The last element in ReleaseTags is assumed to be the current release. - BuildTags []string - ToolTags []string - ReleaseTags []string - - // The install suffix specifies a suffix to use in the name of the installation - // directory. By default it is empty, but custom builds that need to keep - // their outputs separate can set InstallSuffix to do so. For example, when - // using the race detector, the go command uses InstallSuffix = "race", so - // that on a Linux/386 system, packages are written to a directory named - // "linux_386_race" instead of the usual "linux_386". - InstallSuffix string - - // By default, Import uses the operating system's file system calls - // to read directories and files. To read from other sources, - // callers can set the following functions. They all have default - // behaviors that use the local file system, so clients need only set - // the functions whose behaviors they wish to change. - - // JoinPath joins the sequence of path fragments into a single path. - // If JoinPath is nil, Import uses filepath.Join. - JoinPath func(elem ...string) string - - // SplitPathList splits the path list into a slice of individual paths. - // If SplitPathList is nil, Import uses filepath.SplitList. - SplitPathList func(list string) []string - - // IsAbsPath reports whether path is an absolute path. - // If IsAbsPath is nil, Import uses filepath.IsAbs. - IsAbsPath func(path string) bool - - // IsDir reports whether the path names a directory. - // If IsDir is nil, Import calls os.Stat and uses the result's IsDir method. - IsDir func(path string) bool - - // HasSubdir reports whether dir is lexically a subdirectory of - // root, perhaps multiple levels below. It does not try to check - // whether dir exists. - // If so, HasSubdir sets rel to a slash-separated path that - // can be joined to root to produce a path equivalent to dir. - // If HasSubdir is nil, Import uses an implementation built on - // filepath.EvalSymlinks. - HasSubdir func(root, dir string) (rel string, ok bool) - - // ReadDir returns a slice of fs.FileInfo, sorted by Name, - // describing the content of the named directory. - // If ReadDir is nil, Import uses ioutil.ReadDir. - ReadDir func(dir string) ([]fs.FileInfo, error) - - // OpenFile opens a file (not a directory) for reading. - // If OpenFile is nil, Import uses os.Open. - OpenFile func(path string) (io.ReadCloser, error) -} - -// joinPath calls ctxt.JoinPath (if not nil) or else filepath.Join. -func (ctxt *Context) joinPath(elem ...string) string { - if f := ctxt.JoinPath; f != nil { - return f(elem...) - } - return filepath.Join(elem...) -} - -// splitPathList calls ctxt.SplitPathList (if not nil) or else filepath.SplitList. -func (ctxt *Context) splitPathList(s string) []string { - if f := ctxt.SplitPathList; f != nil { - return f(s) - } - return filepath.SplitList(s) -} - -// isAbsPath calls ctxt.IsAbsPath (if not nil) or else filepath.IsAbs. -func (ctxt *Context) isAbsPath(path string) bool { - if f := ctxt.IsAbsPath; f != nil { - return f(path) - } - return filepath.IsAbs(path) -} - -// isDir calls ctxt.IsDir (if not nil) or else uses os.Stat. -func (ctxt *Context) isDir(path string) bool { - if f := ctxt.IsDir; f != nil { - return f(path) - } - fi, err := os.Stat(path) - return err == nil && fi.IsDir() -} - -// hasSubdir calls ctxt.HasSubdir (if not nil) or else uses -// the local file system to answer the question. -func (ctxt *Context) hasSubdir(root, dir string) (rel string, ok bool) { - if f := ctxt.HasSubdir; f != nil { - return f(root, dir) - } - - // Try using paths we received. - if rel, ok = hasSubdir(root, dir); ok { - return - } - - // Try expanding symlinks and comparing - // expanded against unexpanded and - // expanded against expanded. - rootSym, _ := filepath.EvalSymlinks(root) - dirSym, _ := filepath.EvalSymlinks(dir) - - if rel, ok = hasSubdir(rootSym, dir); ok { - return - } - if rel, ok = hasSubdir(root, dirSym); ok { - return - } - return hasSubdir(rootSym, dirSym) -} - -// hasSubdir reports if dir is within root by performing lexical analysis only. -func hasSubdir(root, dir string) (rel string, ok bool) { - const sep = string(filepath.Separator) - root = filepath.Clean(root) - if !strings.HasSuffix(root, sep) { - root += sep - } - dir = filepath.Clean(dir) - if !strings.HasPrefix(dir, root) { - return "", false - } - return filepath.ToSlash(dir[len(root):]), true -} - -// readDir calls ctxt.ReadDir (if not nil) or else ioutil.ReadDir. -func (ctxt *Context) readDir(path string) ([]fs.FileInfo, error) { - if f := ctxt.ReadDir; f != nil { - return f(path) - } - // TODO: use os.ReadDir - return ioutil.ReadDir(path) -} - -// openFile calls ctxt.OpenFile (if not nil) or else os.Open. -func (ctxt *Context) openFile(path string) (io.ReadCloser, error) { - if fn := ctxt.OpenFile; fn != nil { - return fn(path) - } - - f, err := os.Open(path) - if err != nil { - return nil, err // nil interface - } - return f, nil -} - -// isFile determines whether path is a file by trying to open it. -// It reuses openFile instead of adding another function to the -// list in Context. -func (ctxt *Context) isFile(path string) bool { - f, err := ctxt.openFile(path) - if err != nil { - return false - } - f.Close() - return true -} - -// gopath returns the list of Go path directories. -func (ctxt *Context) gopath() []string { - var all []string - for _, p := range ctxt.splitPathList(ctxt.GOPATH) { - if p == "" || p == ctxt.GOROOT { - // Empty paths are uninteresting. - // If the path is the GOROOT, ignore it. - // People sometimes set GOPATH=$GOROOT. - // Do not get confused by this common mistake. - continue - } - if strings.HasPrefix(p, "~") { - // Path segments starting with ~ on Unix are almost always - // users who have incorrectly quoted ~ while setting GOPATH, - // preventing it from expanding to $HOME. - // The situation is made more confusing by the fact that - // bash allows quoted ~ in $PATH (most shells do not). - // Do not get confused by this, and do not try to use the path. - // It does not exist, and printing errors about it confuses - // those users even more, because they think "sure ~ exists!". - // The go command diagnoses this situation and prints a - // useful error. - // On Windows, ~ is used in short names, such as c:\progra~1 - // for c:\program files. - continue - } - all = append(all, p) - } - return all -} - -// SrcDirs returns a list of package source root directories. -// It draws from the current Go root and Go path but omits directories -// that do not exist. -func (ctxt *Context) SrcDirs() []string { - var all []string - if ctxt.GOROOT != "" && ctxt.Compiler != "gccgo" { - dir := ctxt.joinPath(ctxt.GOROOT, "src") - if ctxt.isDir(dir) { - all = append(all, dir) - } - } - for _, p := range ctxt.gopath() { - dir := ctxt.joinPath(p, "src") - if ctxt.isDir(dir) { - all = append(all, dir) - } - } - return all -} - -// Default is the default Context for builds. -// It uses the GOARCH, GOOS, GOROOT, and GOPATH environment variables -// if set, or else the compiled code's GOARCH, GOOS, and GOROOT. -var Default Context = defaultContext() - -func defaultContext() Context { - d := build.Default - return Context{ - GOARCH: d.GOARCH, - GOOS: d.GOOS, - GOROOT: d.GOROOT, - GOPATH: d.GOPATH, - Dir: d.Dir, - CgoEnabled: d.CgoEnabled, - UseAllFiles: d.UseAllFiles, - Compiler: d.Compiler, - BuildTags: d.BuildTags, - ReleaseTags: d.ReleaseTags, - InstallSuffix: d.InstallSuffix, - JoinPath: d.JoinPath, - SplitPathList: d.SplitPathList, - IsAbsPath: d.IsAbsPath, - IsDir: d.IsDir, - HasSubdir: d.HasSubdir, - ReadDir: d.ReadDir, - OpenFile: d.OpenFile, - } -} - -func defaultGOPATH() string { - env := "HOME" - if runtime.GOOS == "windows" { - env = "USERPROFILE" - } else if runtime.GOOS == "plan9" { - env = "home" - } - if home := os.Getenv(env); home != "" { - def := filepath.Join(home, "go") - if filepath.Clean(def) == filepath.Clean(runtime.GOROOT()) { - // Don't set the default GOPATH to GOROOT, - // as that will trigger warnings from the go tool. - return "" - } - return def - } - return "" -} - -var defaultReleaseTags = build.Default.ReleaseTags - -func envOr(name, def string) string { - s := os.Getenv(name) - if s == "" { - return def - } - return s -} - -// An ImportMode controls the behavior of the Import method. -type ImportMode uint - -const ( - // If FindOnly is set, Import stops after locating the directory - // that should contain the sources for a package. It does not - // read any files in the directory. - FindOnly ImportMode = 1 << iota - - // If AllowBinary is set, Import can be satisfied by a compiled - // package object without corresponding sources. - // - // Deprecated: - // The supported way to create a compiled-only package is to - // write source code containing a //go:binary-only-package comment at - // the top of the file. Such a package will be recognized - // regardless of this flag setting (because it has source code) - // and will have BinaryOnly set to true in the returned Package. - AllowBinary - - // If ImportComment is set, parse import comments on package statements. - // Import returns an error if it finds a comment it cannot understand - // or finds conflicting comments in multiple source files. - // See golang.org/s/go14customimport for more information. - ImportComment - - // By default, Import searches vendor directories - // that apply in the given source directory before searching - // the GOROOT and GOPATH roots. - // If an Import finds and returns a package using a vendor - // directory, the resulting ImportPath is the complete path - // to the package, including the path elements leading up - // to and including "vendor". - // For example, if Import("y", "x/subdir", 0) finds - // "x/vendor/y", the returned package's ImportPath is "x/vendor/y", - // not plain "y". - // See golang.org/s/go15vendor for more information. - // - // Setting IgnoreVendor ignores vendor directories. - // - // In contrast to the package's ImportPath, - // the returned package's Imports, TestImports, and XTestImports - // are always the exact import paths from the source files: - // Import makes no attempt to resolve or check those paths. - IgnoreVendor -) - -// A Package describes the Go package found in a directory. -type Package struct { - Dir string // directory containing package sources - Name string // package name - ImportComment string // path in import comment on package statement - Doc string // documentation synopsis - ImportPath string // import path of package ("" if unknown) - Root string // root of Go tree where this package lives - SrcRoot string // package source root directory ("" if unknown) - PkgRoot string // package install root directory ("" if unknown) - PkgTargetRoot string // architecture dependent install root directory ("" if unknown) - BinDir string // command install directory ("" if unknown) - Goroot bool // package found in Go root - PkgObj string // installed .a file - AllTags []string // tags that can influence file selection in this directory - ConflictDir string // this directory shadows Dir in $GOPATH - BinaryOnly bool // cannot be rebuilt from source (has //go:binary-only-package comment) - - // Source files - GoFiles []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles) - CgoFiles []string // .go source files that import "C" - IgnoredGoFiles []string // .go source files ignored for this build (including ignored _test.go files) - InvalidGoFiles []string // .go source files with detected problems (parse error, wrong package name, and so on) - IgnoredOtherFiles []string // non-.go source files ignored for this build - CFiles []string // .c source files - CXXFiles []string // .cc, .cpp and .cxx source files - MFiles []string // .m (Objective-C) source files - HFiles []string // .h, .hh, .hpp and .hxx source files - FFiles []string // .f, .F, .for and .f90 Fortran source files - SFiles []string // .s source files - SwigFiles []string // .swig files - SwigCXXFiles []string // .swigcxx files - SysoFiles []string // .syso system object files to add to archive - - // Cgo directives - CgoCFLAGS []string // Cgo CFLAGS directives - CgoCPPFLAGS []string // Cgo CPPFLAGS directives - CgoCXXFLAGS []string // Cgo CXXFLAGS directives - CgoFFLAGS []string // Cgo FFLAGS directives - CgoLDFLAGS []string // Cgo LDFLAGS directives - CgoPkgConfig []string // Cgo pkg-config directives - - // Test information - TestGoFiles []string // _test.go files in package - XTestGoFiles []string // _test.go files outside package - - // Dependency information - Imports []string // import paths from GoFiles, CgoFiles - ImportPos map[string][]token.Position // line information for Imports - TestImports []string // import paths from TestGoFiles - TestImportPos map[string][]token.Position // line information for TestImports - XTestImports []string // import paths from XTestGoFiles - XTestImportPos map[string][]token.Position // line information for XTestImports - - // //go:embed patterns found in Go source files - // For example, if a source file says - // //go:embed a* b.c - // then the list will contain those two strings as separate entries. - // (See package embed for more details about //go:embed.) - EmbedPatterns []string // patterns from GoFiles, CgoFiles - EmbedPatternPos map[string][]token.Position // line information for EmbedPatterns - TestEmbedPatterns []string // patterns from TestGoFiles - TestEmbedPatternPos map[string][]token.Position // line information for TestEmbedPatterns - XTestEmbedPatterns []string // patterns from XTestGoFiles - XTestEmbedPatternPos map[string][]token.Position // line information for XTestEmbedPatternPos -} - -// IsCommand reports whether the package is considered a -// command to be installed (not just a library). -// Packages named "main" are treated as commands. -func (p *Package) IsCommand() bool { - return p.Name == "main" -} - -// ImportDir is like Import but processes the Go package found in -// the named directory. -func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error) { - return ctxt.Import(".", dir, mode) -} - -// NoGoError is the error used by Import to describe a directory -// containing no buildable Go source files. (It may still contain -// test files, files hidden by build tags, and so on.) -type NoGoError struct { - Dir string -} - -func (e *NoGoError) Error() string { - return "no buildable Go source files in " + e.Dir -} - -// MultiplePackageError describes a directory containing -// multiple buildable Go source files for multiple packages. -type MultiplePackageError struct { - Dir string // directory containing files - Packages []string // package names found - Files []string // corresponding files: Files[i] declares package Packages[i] -} - -func (e *MultiplePackageError) Error() string { - // Error string limited to two entries for compatibility. - return fmt.Sprintf("found packages %s (%s) and %s (%s) in %s", e.Packages[0], e.Files[0], e.Packages[1], e.Files[1], e.Dir) -} - -func nameExt(name string) string { - i := strings.LastIndex(name, ".") - if i < 0 { - return "" - } - return name[i:] -} - -// Import returns details about the Go package named by the import path, -// interpreting local import paths relative to the srcDir directory. -// If the path is a local import path naming a package that can be imported -// using a standard import path, the returned package will set p.ImportPath -// to that path. -// -// In the directory containing the package, .go, .c, .h, and .s files are -// considered part of the package except for: -// -// - .go files in package documentation -// - files starting with _ or . (likely editor temporary files) -// - files with build constraints not satisfied by the context -// -// If an error occurs, Import returns a non-nil error and a non-nil -// *Package containing partial information. -func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Package, error) { - p := &Package{ - ImportPath: path, - } - if path == "" { - return p, fmt.Errorf("import %q: invalid import path", path) - } - - var pkgtargetroot string - var pkga string - var pkgerr error - suffix := "" - if ctxt.InstallSuffix != "" { - suffix = "_" + ctxt.InstallSuffix - } - switch ctxt.Compiler { - case "gccgo": - pkgtargetroot = "pkg/gccgo_" + ctxt.GOOS + "_" + ctxt.GOARCH + suffix - case "gc": - pkgtargetroot = "pkg/" + ctxt.GOOS + "_" + ctxt.GOARCH + suffix - default: - // Save error for end of function. - pkgerr = fmt.Errorf("import %q: unknown compiler %q", path, ctxt.Compiler) - } - setPkga := func() { - switch ctxt.Compiler { - case "gccgo": - dir, elem := pathpkg.Split(p.ImportPath) - pkga = pkgtargetroot + "/" + dir + "lib" + elem + ".a" - case "gc": - pkga = pkgtargetroot + "/" + p.ImportPath + ".a" - } - } - setPkga() - - binaryOnly := false - if IsLocalImport(path) { - pkga = "" // local imports have no installed path - if srcDir == "" { - return p, fmt.Errorf("import %q: import relative to unknown directory", path) - } - if !ctxt.isAbsPath(path) { - p.Dir = ctxt.joinPath(srcDir, path) - } - // p.Dir directory may or may not exist. Gather partial information first, check if it exists later. - // Determine canonical import path, if any. - // Exclude results where the import path would include /testdata/. - inTestdata := func(sub string) bool { - return strings.Contains(sub, "/testdata/") || strings.HasSuffix(sub, "/testdata") || strings.HasPrefix(sub, "testdata/") || sub == "testdata" - } - if ctxt.GOROOT != "" { - root := ctxt.joinPath(ctxt.GOROOT, "src") - if sub, ok := ctxt.hasSubdir(root, p.Dir); ok && !inTestdata(sub) { - p.Goroot = true - p.ImportPath = sub - p.Root = ctxt.GOROOT - setPkga() // p.ImportPath changed - goto Found - } - } - all := ctxt.gopath() - for i, root := range all { - rootsrc := ctxt.joinPath(root, "src") - if sub, ok := ctxt.hasSubdir(rootsrc, p.Dir); ok && !inTestdata(sub) { - // We found a potential import path for dir, - // but check that using it wouldn't find something - // else first. - if ctxt.GOROOT != "" && ctxt.Compiler != "gccgo" { - if dir := ctxt.joinPath(ctxt.GOROOT, "src", sub); ctxt.isDir(dir) { - p.ConflictDir = dir - goto Found - } - } - for _, earlyRoot := range all[:i] { - if dir := ctxt.joinPath(earlyRoot, "src", sub); ctxt.isDir(dir) { - p.ConflictDir = dir - goto Found - } - } - - // sub would not name some other directory instead of this one. - // Record it. - p.ImportPath = sub - p.Root = root - setPkga() // p.ImportPath changed - goto Found - } - } - // It's okay that we didn't find a root containing dir. - // Keep going with the information we have. - } else { - if strings.HasPrefix(path, "/") { - return p, fmt.Errorf("import %q: cannot import absolute path", path) - } - - if err := ctxt.importGo(p, path, srcDir, mode); err == nil { - goto Found - } else if err != errNoModules { - return p, err - } - - gopath := ctxt.gopath() // needed twice below; avoid computing many times - - // tried records the location of unsuccessful package lookups - var tried struct { - vendor []string - goroot string - gopath []string - } - - // Vendor directories get first chance to satisfy import. - if mode&IgnoreVendor == 0 && srcDir != "" { - searchVendor := func(root string, isGoroot bool) bool { - sub, ok := ctxt.hasSubdir(root, srcDir) - if !ok || !strings.HasPrefix(sub, "src/") || strings.Contains(sub, "/testdata/") { - return false - } - for { - vendor := ctxt.joinPath(root, sub, "vendor") - if ctxt.isDir(vendor) { - dir := ctxt.joinPath(vendor, path) - if ctxt.isDir(dir) && hasGoFiles(ctxt, dir) { - p.Dir = dir - p.ImportPath = strings.TrimPrefix(pathpkg.Join(sub, "vendor", path), "src/") - p.Goroot = isGoroot - p.Root = root - setPkga() // p.ImportPath changed - return true - } - tried.vendor = append(tried.vendor, dir) - } - i := strings.LastIndex(sub, "/") - if i < 0 { - break - } - sub = sub[:i] - } - return false - } - if ctxt.Compiler != "gccgo" && searchVendor(ctxt.GOROOT, true) { - goto Found - } - for _, root := range gopath { - if searchVendor(root, false) { - goto Found - } - } - } - - // Determine directory from import path. - if ctxt.GOROOT != "" { - // If the package path starts with "vendor/", only search GOROOT before - // GOPATH if the importer is also within GOROOT. That way, if the user has - // vendored in a package that is subsequently included in the standard - // distribution, they'll continue to pick up their own vendored copy. - gorootFirst := srcDir == "" || !strings.HasPrefix(path, "vendor/") - if !gorootFirst { - _, gorootFirst = ctxt.hasSubdir(ctxt.GOROOT, srcDir) - } - if gorootFirst { - dir := ctxt.joinPath(ctxt.GOROOT, "src", path) - if ctxt.Compiler != "gccgo" { - isDir := ctxt.isDir(dir) - binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga)) - if isDir || binaryOnly { - p.Dir = dir - p.Goroot = true - p.Root = ctxt.GOROOT - goto Found - } - } - tried.goroot = dir - } - } - for _, root := range gopath { - dir := ctxt.joinPath(root, "src", path) - isDir := ctxt.isDir(dir) - binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(root, pkga)) - if isDir || binaryOnly { - p.Dir = dir - p.Root = root - goto Found - } - tried.gopath = append(tried.gopath, dir) - } - - // If we tried GOPATH first due to a "vendor/" prefix, fall back to GOPATH. - // That way, the user can still get useful results from 'go list' for - // standard-vendored paths passed on the command line. - if ctxt.GOROOT != "" && tried.goroot == "" { - dir := ctxt.joinPath(ctxt.GOROOT, "src", path) - if ctxt.Compiler != "gccgo" { - isDir := ctxt.isDir(dir) - binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga)) - if isDir || binaryOnly { - p.Dir = dir - p.Goroot = true - p.Root = ctxt.GOROOT - goto Found - } - } - tried.goroot = dir - } - - // package was not found - var paths []string - format := "\t%s (vendor tree)" - for _, dir := range tried.vendor { - paths = append(paths, fmt.Sprintf(format, dir)) - format = "\t%s" - } - if tried.goroot != "" { - paths = append(paths, fmt.Sprintf("\t%s (from $GOROOT)", tried.goroot)) - } else { - paths = append(paths, "\t($GOROOT not set)") - } - format = "\t%s (from $GOPATH)" - for _, dir := range tried.gopath { - paths = append(paths, fmt.Sprintf(format, dir)) - format = "\t%s" - } - if len(tried.gopath) == 0 { - paths = append(paths, "\t($GOPATH not set. For more details see: 'go help gopath')") - } - return p, fmt.Errorf("cannot find package %q in any of:\n%s", path, strings.Join(paths, "\n")) - } - -Found: - if p.Root != "" { - p.SrcRoot = ctxt.joinPath(p.Root, "src") - p.PkgRoot = ctxt.joinPath(p.Root, "pkg") - p.BinDir = ctxt.joinPath(p.Root, "bin") - if pkga != "" { - p.PkgTargetRoot = ctxt.joinPath(p.Root, pkgtargetroot) - p.PkgObj = ctxt.joinPath(p.Root, pkga) - } - } - - // If it's a local import path, by the time we get here, we still haven't checked - // that p.Dir directory exists. This is the right time to do that check. - // We can't do it earlier, because we want to gather partial information for the - // non-nil *Package returned when an error occurs. - // We need to do this before we return early on FindOnly flag. - if IsLocalImport(path) && !ctxt.isDir(p.Dir) { - if ctxt.Compiler == "gccgo" && p.Goroot { - // gccgo has no sources for GOROOT packages. - return p, nil - } - - // package was not found - return p, fmt.Errorf("cannot find package %q in:\n\t%s", p.ImportPath, p.Dir) - } - - if mode&FindOnly != 0 { - return p, pkgerr - } - if binaryOnly && (mode&AllowBinary) != 0 { - return p, pkgerr - } - - if ctxt.Compiler == "gccgo" && p.Goroot { - // gccgo has no sources for GOROOT packages. - return p, nil - } - - dirs, err := ctxt.readDir(p.Dir) - if err != nil { - return p, err - } - - var badGoError error - badFiles := make(map[string]bool) - badFile := func(name string, err error) { - if badGoError == nil { - badGoError = err - } - if !badFiles[name] { - p.InvalidGoFiles = append(p.InvalidGoFiles, name) - badFiles[name] = true - } - } - - var Sfiles []string // files with ".S"(capital S)/.sx(capital s equivalent for case insensitive filesystems) - var firstFile, firstCommentFile string - embedPos := make(map[string][]token.Position) - testEmbedPos := make(map[string][]token.Position) - xTestEmbedPos := make(map[string][]token.Position) - importPos := make(map[string][]token.Position) - testImportPos := make(map[string][]token.Position) - xTestImportPos := make(map[string][]token.Position) - allTags := make(map[string]bool) - fset := token.NewFileSet() - for _, d := range dirs { - if d.IsDir() { - continue - } - if d.Mode()&fs.ModeSymlink != 0 { - if ctxt.isDir(ctxt.joinPath(p.Dir, d.Name())) { - // Symlinks to directories are not source files. - continue - } - } - - name := d.Name() - ext := nameExt(name) - - info, err := ctxt.matchFile(p.Dir, name, allTags, &p.BinaryOnly, fset) - if err != nil { - badFile(name, err) - continue - } - if info == nil { - if strings.HasPrefix(name, "_") || strings.HasPrefix(name, ".") { - // not due to build constraints - don't report - } else if ext == ".go" { - p.IgnoredGoFiles = append(p.IgnoredGoFiles, name) - } else if fileListForExt(p, ext) != nil { - p.IgnoredOtherFiles = append(p.IgnoredOtherFiles, name) - } - continue - } - data, filename := info.header, info.name - - // Going to save the file. For non-Go files, can stop here. - switch ext { - case ".go": - // keep going - case ".S", ".sx": - // special case for cgo, handled at end - Sfiles = append(Sfiles, name) - continue - default: - if list := fileListForExt(p, ext); list != nil { - *list = append(*list, name) - } - continue - } - - if info.parseErr != nil { - badFile(name, info.parseErr) - // Fall through: we might still have a partial AST in info.parsed, - // and we want to list files with parse errors anyway. - } - - var pkg string - if info.parsed != nil { - pkg = info.parsed.Name.Name - if pkg == "documentation" { - p.IgnoredGoFiles = append(p.IgnoredGoFiles, name) - continue - } - } - - isTest := strings.HasSuffix(name, "_test.go") - isXTest := false - if isTest && strings.HasSuffix(pkg, "_test") && p.Name != pkg { - isXTest = true - pkg = pkg[:len(pkg)-len("_test")] - } - - if p.Name == "" { - p.Name = pkg - firstFile = name - } else if pkg != p.Name { - // TODO(#45999): The choice of p.Name is arbitrary based on file iteration - // order. Instead of resolving p.Name arbitrarily, we should clear out the - // existing name and mark the existing files as also invalid. - badFile(name, &MultiplePackageError{ - Dir: p.Dir, - Packages: []string{p.Name, pkg}, - Files: []string{firstFile, name}, - }) - } - // Grab the first package comment as docs, provided it is not from a test file. - if info.parsed != nil && info.parsed.Doc != nil && p.Doc == "" && !isTest && !isXTest { - p.Doc = doc.Synopsis(info.parsed.Doc.Text()) - } - - if mode&ImportComment != 0 { - qcom, line := findImportComment(data) - if line != 0 { - com, err := strconv.Unquote(qcom) - if err != nil { - badFile(name, fmt.Errorf("%s:%d: cannot parse import comment", filename, line)) - } else if p.ImportComment == "" { - p.ImportComment = com - firstCommentFile = name - } else if p.ImportComment != com { - badFile(name, fmt.Errorf("found import comments %q (%s) and %q (%s) in %s", p.ImportComment, firstCommentFile, com, name, p.Dir)) - } - } - } - - // Record imports and information about cgo. - isCgo := false - for _, imp := range info.imports { - if imp.path == "C" { - if isTest { - badFile(name, fmt.Errorf("use of cgo in test %s not supported", filename)) - continue - } - isCgo = true - if imp.doc != nil { - if err := ctxt.saveCgo(filename, p, imp.doc); err != nil { - badFile(name, err) - } - } - } - } - - var fileList *[]string - var importMap, embedMap map[string][]token.Position - switch { - case isCgo: - allTags["cgo"] = true - if ctxt.CgoEnabled { - fileList = &p.CgoFiles - importMap = importPos - embedMap = embedPos - } else { - // Ignore imports and embeds from cgo files if cgo is disabled. - fileList = &p.IgnoredGoFiles - } - case isXTest: - fileList = &p.XTestGoFiles - importMap = xTestImportPos - embedMap = xTestEmbedPos - case isTest: - fileList = &p.TestGoFiles - importMap = testImportPos - embedMap = testEmbedPos - default: - fileList = &p.GoFiles - importMap = importPos - embedMap = embedPos - } - *fileList = append(*fileList, name) - if importMap != nil { - for _, imp := range info.imports { - importMap[imp.path] = append(importMap[imp.path], fset.Position(imp.pos)) - } - } - if embedMap != nil { - for _, emb := range info.embeds { - embedMap[emb.pattern] = append(embedMap[emb.pattern], emb.pos) - } - } - } - - for tag := range allTags { - p.AllTags = append(p.AllTags, tag) - } - sort.Strings(p.AllTags) - - p.EmbedPatterns, p.EmbedPatternPos = cleanDecls(embedPos) - p.TestEmbedPatterns, p.TestEmbedPatternPos = cleanDecls(testEmbedPos) - p.XTestEmbedPatterns, p.XTestEmbedPatternPos = cleanDecls(xTestEmbedPos) - - p.Imports, p.ImportPos = cleanDecls(importPos) - p.TestImports, p.TestImportPos = cleanDecls(testImportPos) - p.XTestImports, p.XTestImportPos = cleanDecls(xTestImportPos) - - // add the .S/.sx files only if we are using cgo - // (which means gcc will compile them). - // The standard assemblers expect .s files. - if len(p.CgoFiles) > 0 { - p.SFiles = append(p.SFiles, Sfiles...) - sort.Strings(p.SFiles) - } else { - p.IgnoredOtherFiles = append(p.IgnoredOtherFiles, Sfiles...) - sort.Strings(p.IgnoredOtherFiles) - } - - if badGoError != nil { - return p, badGoError - } - if len(p.GoFiles)+len(p.CgoFiles)+len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 { - return p, &NoGoError{p.Dir} - } - return p, pkgerr -} - -func fileListForExt(p *Package, ext string) *[]string { - switch ext { - case ".c": - return &p.CFiles - case ".cc", ".cpp", ".cxx": - return &p.CXXFiles - case ".m": - return &p.MFiles - case ".h", ".hh", ".hpp", ".hxx": - return &p.HFiles - case ".f", ".F", ".for", ".f90": - return &p.FFiles - case ".s", ".S", ".sx": - return &p.SFiles - case ".swig": - return &p.SwigFiles - case ".swigcxx": - return &p.SwigCXXFiles - case ".syso": - return &p.SysoFiles - } - return nil -} - -func uniq(list []string) []string { - if list == nil { - return nil - } - out := make([]string, len(list)) - copy(out, list) - sort.Strings(out) - uniq := out[:0] - for _, x := range out { - if len(uniq) == 0 || uniq[len(uniq)-1] != x { - uniq = append(uniq, x) - } - } - return uniq -} - -var errNoModules = errors.New("not using modules") - -// importGo checks whether it can use the go command to find the directory for path. -// If using the go command is not appropriate, importGo returns errNoModules. -// Otherwise, importGo tries using the go command and reports whether that succeeded. -// Using the go command lets build.Import and build.Context.Import find code -// in Go modules. In the long term we want tools to use go/packages (currently golang.org/x/tools/go/packages), -// which will also use the go command. -// Invoking the go command here is not very efficient in that it computes information -// about the requested package and all dependencies and then only reports about the requested package. -// Then we reinvoke it for every dependency. But this is still better than not working at all. -// See golang.org/issue/26504. -func (ctxt *Context) importGo(p *Package, path, srcDir string, mode ImportMode) error { - // To invoke the go command, - // we must not being doing special things like AllowBinary or IgnoreVendor, - // and all the file system callbacks must be nil (we're meant to use the local file system). - if mode&AllowBinary != 0 || mode&IgnoreVendor != 0 || - ctxt.JoinPath != nil || ctxt.SplitPathList != nil || ctxt.IsAbsPath != nil || ctxt.IsDir != nil || ctxt.HasSubdir != nil || ctxt.ReadDir != nil || ctxt.OpenFile != nil || !equal(ctxt.ReleaseTags, defaultReleaseTags) { - return errNoModules - } - - // Predict whether module aware mode is enabled by checking the value of - // GO111MODULE and looking for a go.mod file in the source directory or - // one of its parents. Running 'go env GOMOD' in the source directory would - // give a canonical answer, but we'd prefer not to execute another command. - go111Module := os.Getenv("GO111MODULE") - switch go111Module { - case "off": - return errNoModules - default: // "", "on", "auto", anything else - // Maybe use modules. - } - - if srcDir != "" { - var absSrcDir string - if filepath.IsAbs(srcDir) { - absSrcDir = srcDir - } else if ctxt.Dir != "" { - return fmt.Errorf("go/build: Dir is non-empty, so relative srcDir is not allowed: %v", srcDir) - } else { - // Find the absolute source directory. hasSubdir does not handle - // relative paths (and can't because the callbacks don't support this). - var err error - absSrcDir, err = filepath.Abs(srcDir) - if err != nil { - return errNoModules - } - } - - // If the source directory is in GOROOT, then the in-process code works fine - // and we should keep using it. Moreover, the 'go list' approach below doesn't - // take standard-library vendoring into account and will fail. - if _, ok := ctxt.hasSubdir(filepath.Join(ctxt.GOROOT, "src"), absSrcDir); ok { - return errNoModules - } - } - - // For efficiency, if path is a standard library package, let the usual lookup code handle it. - if ctxt.GOROOT != "" { - dir := ctxt.joinPath(ctxt.GOROOT, "src", path) - if ctxt.isDir(dir) { - return errNoModules - } - } - - // If GO111MODULE=auto, look to see if there is a go.mod. - // Since go1.13, it doesn't matter if we're inside GOPATH. - if go111Module == "auto" { - var ( - parent string - err error - ) - if ctxt.Dir == "" { - parent, err = os.Getwd() - if err != nil { - // A nonexistent working directory can't be in a module. - return errNoModules - } - } else { - parent, err = filepath.Abs(ctxt.Dir) - if err != nil { - // If the caller passed a bogus Dir explicitly, that's materially - // different from not having modules enabled. - return err - } - } - for { - if f, err := ctxt.openFile(ctxt.joinPath(parent, "go.mod")); err == nil { - buf := make([]byte, 100) - _, err := f.Read(buf) - f.Close() - if err == nil || err == io.EOF { - // go.mod exists and is readable (is a file, not a directory). - break - } - } - d := filepath.Dir(parent) - if len(d) >= len(parent) { - return errNoModules // reached top of file system, no go.mod - } - parent = d - } - } - - cmd := exec.Command("go", "list", "-e", "-compiler="+ctxt.Compiler, "-tags="+strings.Join(ctxt.BuildTags, ","), "-installsuffix="+ctxt.InstallSuffix, "-f={{.Dir}}\n{{.ImportPath}}\n{{.Root}}\n{{.Goroot}}\n{{if .Error}}{{.Error}}{{end}}\n", "--", path) - - if ctxt.Dir != "" { - cmd.Dir = ctxt.Dir - } - - var stdout, stderr strings.Builder - cmd.Stdout = &stdout - cmd.Stderr = &stderr - - cgo := "0" - if ctxt.CgoEnabled { - cgo = "1" - } - cmd.Env = append(os.Environ(), - "GOOS="+ctxt.GOOS, - "GOARCH="+ctxt.GOARCH, - "GOROOT="+ctxt.GOROOT, - "GOPATH="+ctxt.GOPATH, - "CGO_ENABLED="+cgo, - ) - - if err := cmd.Run(); err != nil { - return fmt.Errorf("go/build: go list %s: %v\n%s\n", path, err, stderr.String()) - } - - f := strings.SplitN(stdout.String(), "\n", 5) - if len(f) != 5 { - return fmt.Errorf("go/build: importGo %s: unexpected output:\n%s\n", path, stdout.String()) - } - dir := f[0] - errStr := strings.TrimSpace(f[4]) - if errStr != "" && dir == "" { - // If 'go list' could not locate the package (dir is empty), - // return the same error that 'go list' reported. - return errors.New(errStr) - } - - // If 'go list' did locate the package, ignore the error. - // It was probably related to loading source files, and we'll - // encounter it ourselves shortly if the FindOnly flag isn't set. - p.Dir = dir - p.ImportPath = f[1] - p.Root = f[2] - p.Goroot = f[3] == "true" - return nil -} - -func equal(x, y []string) bool { - if len(x) != len(y) { - return false - } - for i, xi := range x { - if xi != y[i] { - return false - } - } - return true -} - -// hasGoFiles reports whether dir contains any files with names ending in .go. -// For a vendor check we must exclude directories that contain no .go files. -// Otherwise it is not possible to vendor just a/b/c and still import the -// non-vendored a/b. See golang.org/issue/13832. -func hasGoFiles(ctxt *Context, dir string) bool { - ents, _ := ctxt.readDir(dir) - for _, ent := range ents { - if !ent.IsDir() && strings.HasSuffix(ent.Name(), ".go") { - return true - } - } - return false -} - -func findImportComment(data []byte) (s string, line int) { - // expect keyword package - word, data := parseWord(data) - if string(word) != "package" { - return "", 0 - } - - // expect package name - _, data = parseWord(data) - - // now ready for import comment, a // or /* */ comment - // beginning and ending on the current line. - for len(data) > 0 && (data[0] == ' ' || data[0] == '\t' || data[0] == '\r') { - data = data[1:] - } - - var comment []byte - switch { - case bytes.HasPrefix(data, slashSlash): - comment, _, _ = bytesCut(data[2:], newline) - case bytes.HasPrefix(data, slashStar): - var ok bool - comment, _, ok = bytesCut(data[2:], starSlash) - if !ok { - // malformed comment - return "", 0 - } - if bytes.Contains(comment, newline) { - return "", 0 - } - } - comment = bytes.TrimSpace(comment) - - // split comment into `import`, `"pkg"` - word, arg := parseWord(comment) - if string(word) != "import" { - return "", 0 - } - - line = 1 + bytes.Count(data[:cap(data)-cap(arg)], newline) - return strings.TrimSpace(string(arg)), line -} - -var ( - slashSlash = []byte("//") - slashStar = []byte("/*") - starSlash = []byte("*/") - newline = []byte("\n") -) - -// skipSpaceOrComment returns data with any leading spaces or comments removed. -func skipSpaceOrComment(data []byte) []byte { - for len(data) > 0 { - switch data[0] { - case ' ', '\t', '\r', '\n': - data = data[1:] - continue - case '/': - if bytes.HasPrefix(data, slashSlash) { - i := bytes.Index(data, newline) - if i < 0 { - return nil - } - data = data[i+1:] - continue - } - if bytes.HasPrefix(data, slashStar) { - data = data[2:] - i := bytes.Index(data, starSlash) - if i < 0 { - return nil - } - data = data[i+2:] - continue - } - } - break - } - return data -} - -// parseWord skips any leading spaces or comments in data -// and then parses the beginning of data as an identifier or keyword, -// returning that word and what remains after the word. -func parseWord(data []byte) (word, rest []byte) { - data = skipSpaceOrComment(data) - - // Parse past leading word characters. - rest = data - for { - r, size := utf8.DecodeRune(rest) - if unicode.IsLetter(r) || '0' <= r && r <= '9' || r == '_' { - rest = rest[size:] - continue - } - break - } - - word = data[:len(data)-len(rest)] - if len(word) == 0 { - return nil, nil - } - - return word, rest -} - -// MatchFile reports whether the file with the given name in the given directory -// matches the context and would be included in a Package created by ImportDir -// of that directory. -// -// MatchFile considers the name of the file and may use ctxt.OpenFile to -// read some or all of the file's content. -func (ctxt *Context) MatchFile(dir, name string) (match bool, err error) { - info, err := ctxt.matchFile(dir, name, nil, nil, nil) - return info != nil, err -} - -var dummyPkg Package - -// fileInfo records information learned about a file included in a build. -type fileInfo struct { - name string // full name including dir - header []byte - fset *token.FileSet - parsed *ast.File - parseErr error - imports []fileImport - embeds []fileEmbed - embedErr error -} - -type fileImport struct { - path string - pos token.Pos - doc *ast.CommentGroup -} - -type fileEmbed struct { - pattern string - pos token.Position -} - -// matchFile determines whether the file with the given name in the given directory -// should be included in the package being constructed. -// If the file should be included, matchFile returns a non-nil *fileInfo (and a nil error). -// Non-nil errors are reserved for unexpected problems. -// -// If name denotes a Go program, matchFile reads until the end of the -// imports and returns that section of the file in the fileInfo's header field, -// even though it only considers text until the first non-comment -// for +build lines. -// -// If allTags is non-nil, matchFile records any encountered build tag -// by setting allTags[tag] = true. -func (ctxt *Context) matchFile(dir, name string, allTags map[string]bool, binaryOnly *bool, fset *token.FileSet) (*fileInfo, error) { - if strings.HasPrefix(name, "_") || - strings.HasPrefix(name, ".") { - return nil, nil - } - - i := strings.LastIndex(name, ".") - if i < 0 { - i = len(name) - } - ext := name[i:] - - if !ctxt.goodOSArchFile(name, allTags) && !ctxt.UseAllFiles { - return nil, nil - } - - if ext != ".go" && fileListForExt(&dummyPkg, ext) == nil { - // skip - return nil, nil - } - - info := &fileInfo{name: ctxt.joinPath(dir, name), fset: fset} - if ext == ".syso" { - // binary, no reading - return info, nil - } - - f, err := ctxt.openFile(info.name) - if err != nil { - return nil, err - } - - if strings.HasSuffix(name, ".go") { - err = readGoInfo(f, info) - if strings.HasSuffix(name, "_test.go") { - binaryOnly = nil // ignore //go:binary-only-package comments in _test.go files - } - } else { - binaryOnly = nil // ignore //go:binary-only-package comments in non-Go sources - info.header, err = readComments(f) - } - f.Close() - if err != nil { - return nil, fmt.Errorf("read %s: %v", info.name, err) - } - - // Look for +build comments to accept or reject the file. - ok, sawBinaryOnly, err := ctxt.shouldBuild(info.header, allTags) - if err != nil { - return nil, fmt.Errorf("%s: %v", name, err) - } - if !ok && !ctxt.UseAllFiles { - return nil, nil - } - - if binaryOnly != nil && sawBinaryOnly { - *binaryOnly = true - } - - return info, nil -} - -func cleanDecls(m map[string][]token.Position) ([]string, map[string][]token.Position) { - all := make([]string, 0, len(m)) - for path := range m { - all = append(all, path) - } - sort.Strings(all) - return all, m -} - -// Import is shorthand for Default.Import. -func Import(path, srcDir string, mode ImportMode) (*Package, error) { - return Default.Import(path, srcDir, mode) -} - -// ImportDir is shorthand for Default.ImportDir. -func ImportDir(dir string, mode ImportMode) (*Package, error) { - return Default.ImportDir(dir, mode) -} - -var ( - bPlusBuild = []byte("+build") - - goBuildComment = []byte("//go:build") - - errGoBuildWithoutBuild = errors.New("//go:build comment without // +build comment") - errMultipleGoBuild = errors.New("multiple //go:build comments") -) - -func isGoBuildComment(line []byte) bool { - if !bytes.HasPrefix(line, goBuildComment) { - return false - } - line = bytes.TrimSpace(line) - rest := line[len(goBuildComment):] - return len(rest) == 0 || len(bytes.TrimSpace(rest)) < len(rest) -} - -// Special comment denoting a binary-only package. -// See https://golang.org/design/2775-binary-only-packages -// for more about the design of binary-only packages. -var binaryOnlyComment = []byte("//go:binary-only-package") - -// shouldBuild reports whether it is okay to use this file, -// The rule is that in the file's leading run of // comments -// and blank lines, which must be followed by a blank line -// (to avoid including a Go package clause doc comment), -// lines beginning with '// +build' are taken as build directives. -// -// The file is accepted only if each such line lists something -// matching the file. For example: -// -// // +build windows linux -// -// marks the file as applicable only on Windows and Linux. -// -// For each build tag it consults, shouldBuild sets allTags[tag] = true. -// -// shouldBuild reports whether the file should be built -// and whether a //go:binary-only-package comment was found. -func (ctxt *Context) shouldBuild(content []byte, allTags map[string]bool) (shouldBuild, binaryOnly bool, err error) { - // Identify leading run of // comments and blank lines, - // which must be followed by a blank line. - // Also identify any //go:build comments. - content, goBuild, sawBinaryOnly, err := parseFileHeader(content) - if err != nil { - return false, false, err - } - - // If //go:build line is present, it controls. - // Otherwise fall back to +build processing. - switch { - case goBuild != nil: - x, err := constraint.Parse(string(goBuild)) - if err != nil { - return false, false, fmt.Errorf("parsing //go:build line: %v", err) - } - shouldBuild = ctxt.eval(x, allTags) - - default: - shouldBuild = true - p := content - for len(p) > 0 { - line := p - if i := bytes.IndexByte(line, '\n'); i >= 0 { - line, p = line[:i], p[i+1:] - } else { - p = p[len(p):] - } - line = bytes.TrimSpace(line) - if !bytes.HasPrefix(line, slashSlash) || !bytes.Contains(line, bPlusBuild) { - continue - } - text := string(line) - if !constraint.IsPlusBuild(text) { - continue - } - if x, err := constraint.Parse(text); err == nil { - if !ctxt.eval(x, allTags) { - shouldBuild = false - } - } - } - } - - return shouldBuild, sawBinaryOnly, nil -} - -func parseFileHeader(content []byte) (trimmed, goBuild []byte, sawBinaryOnly bool, err error) { - end := 0 - p := content - ended := false // found non-blank, non-// line, so stopped accepting // +build lines - inSlashStar := false // in /* */ comment - -Lines: - for len(p) > 0 { - line := p - if i := bytes.IndexByte(line, '\n'); i >= 0 { - line, p = line[:i], p[i+1:] - } else { - p = p[len(p):] - } - line = bytes.TrimSpace(line) - if len(line) == 0 && !ended { // Blank line - // Remember position of most recent blank line. - // When we find the first non-blank, non-// line, - // this "end" position marks the latest file position - // where a // +build line can appear. - // (It must appear _before_ a blank line before the non-blank, non-// line. - // Yes, that's confusing, which is part of why we moved to //go:build lines.) - // Note that ended==false here means that inSlashStar==false, - // since seeing a /* would have set ended==true. - end = len(content) - len(p) - continue Lines - } - if !bytes.HasPrefix(line, slashSlash) { // Not comment line - ended = true - } - - if !inSlashStar && isGoBuildComment(line) { - if goBuild != nil { - return nil, nil, false, errMultipleGoBuild - } - goBuild = line - } - if !inSlashStar && bytes.Equal(line, binaryOnlyComment) { - sawBinaryOnly = true - } - - Comments: - for len(line) > 0 { - if inSlashStar { - if i := bytes.Index(line, starSlash); i >= 0 { - inSlashStar = false - line = bytes.TrimSpace(line[i+len(starSlash):]) - continue Comments - } - continue Lines - } - if bytes.HasPrefix(line, slashSlash) { - continue Lines - } - if bytes.HasPrefix(line, slashStar) { - inSlashStar = true - line = bytes.TrimSpace(line[len(slashStar):]) - continue Comments - } - // Found non-comment text. - break Lines - } - } - - return content[:end], goBuild, sawBinaryOnly, nil -} - -// saveCgo saves the information from the #cgo lines in the import "C" comment. -// These lines set CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS and pkg-config directives -// that affect the way cgo's C code is built. -func (ctxt *Context) saveCgo(filename string, di *Package, cg *ast.CommentGroup) error { - text := cg.Text() - for _, line := range strings.Split(text, "\n") { - orig := line - - // Line is - // #cgo [GOOS/GOARCH...] LDFLAGS: stuff - // - line = strings.TrimSpace(line) - if len(line) < 5 || line[:4] != "#cgo" || (line[4] != ' ' && line[4] != '\t') { - continue - } - - // Split at colon. - line, argstr, ok := stringsCut(strings.TrimSpace(line[4:]), ":") - if !ok { - return fmt.Errorf("%s: invalid #cgo line: %s", filename, orig) - } - - // Parse GOOS/GOARCH stuff. - f := strings.Fields(line) - if len(f) < 1 { - return fmt.Errorf("%s: invalid #cgo line: %s", filename, orig) - } - - cond, verb := f[:len(f)-1], f[len(f)-1] - if len(cond) > 0 { - ok := false - for _, c := range cond { - if ctxt.matchAuto(c, nil) { - ok = true - break - } - } - if !ok { - continue - } - } - - args, err := splitQuoted(argstr) - if err != nil { - return fmt.Errorf("%s: invalid #cgo line: %s", filename, orig) - } - for i, arg := range args { - if arg, ok = expandSrcDir(arg, di.Dir); !ok { - return fmt.Errorf("%s: malformed #cgo argument: %s", filename, arg) - } - args[i] = arg - } - - switch verb { - case "CFLAGS", "CPPFLAGS", "CXXFLAGS", "FFLAGS", "LDFLAGS": - // Change relative paths to absolute. - ctxt.makePathsAbsolute(args, di.Dir) - } - - switch verb { - case "CFLAGS": - di.CgoCFLAGS = append(di.CgoCFLAGS, args...) - case "CPPFLAGS": - di.CgoCPPFLAGS = append(di.CgoCPPFLAGS, args...) - case "CXXFLAGS": - di.CgoCXXFLAGS = append(di.CgoCXXFLAGS, args...) - case "FFLAGS": - di.CgoFFLAGS = append(di.CgoFFLAGS, args...) - case "LDFLAGS": - di.CgoLDFLAGS = append(di.CgoLDFLAGS, args...) - case "pkg-config": - di.CgoPkgConfig = append(di.CgoPkgConfig, args...) - default: - return fmt.Errorf("%s: invalid #cgo verb: %s", filename, orig) - } - } - return nil -} - -// expandSrcDir expands any occurrence of ${SRCDIR}, making sure -// the result is safe for the shell. -func expandSrcDir(str string, srcdir string) (string, bool) { - // "\" delimited paths cause safeCgoName to fail - // so convert native paths with a different delimiter - // to "/" before starting (eg: on windows). - srcdir = filepath.ToSlash(srcdir) - - chunks := strings.Split(str, "${SRCDIR}") - if len(chunks) < 2 { - return str, safeCgoName(str) - } - ok := true - for _, chunk := range chunks { - ok = ok && (chunk == "" || safeCgoName(chunk)) - } - ok = ok && (srcdir == "" || safeCgoName(srcdir)) - res := strings.Join(chunks, srcdir) - return res, ok && res != "" -} - -// makePathsAbsolute looks for compiler options that take paths and -// makes them absolute. We do this because through the 1.8 release we -// ran the compiler in the package directory, so any relative -I or -L -// options would be relative to that directory. In 1.9 we changed to -// running the compiler in the build directory, to get consistent -// build results (issue #19964). To keep builds working, we change any -// relative -I or -L options to be absolute. -// -// Using filepath.IsAbs and filepath.Join here means the results will be -// different on different systems, but that's OK: -I and -L options are -// inherently system-dependent. -func (ctxt *Context) makePathsAbsolute(args []string, srcDir string) { - nextPath := false - for i, arg := range args { - if nextPath { - if !filepath.IsAbs(arg) { - args[i] = filepath.Join(srcDir, arg) - } - nextPath = false - } else if strings.HasPrefix(arg, "-I") || strings.HasPrefix(arg, "-L") { - if len(arg) == 2 { - nextPath = true - } else { - if !filepath.IsAbs(arg[2:]) { - args[i] = arg[:2] + filepath.Join(srcDir, arg[2:]) - } - } - } - } -} - -// NOTE: $ is not safe for the shell, but it is allowed here because of linker options like -Wl,$ORIGIN. -// We never pass these arguments to a shell (just to programs we construct argv for), so this should be okay. -// See golang.org/issue/6038. -// The @ is for OS X. See golang.org/issue/13720. -// The % is for Jenkins. See golang.org/issue/16959. -// The ! is because module paths may use them. See golang.org/issue/26716. -// The ~ and ^ are for sr.ht. See golang.org/issue/32260. -const safeString = "+-.,/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz:$@%! ~^" - -func safeCgoName(s string) bool { - if s == "" { - return false - } - for i := 0; i < len(s); i++ { - if c := s[i]; c < utf8.RuneSelf && strings.IndexByte(safeString, c) < 0 { - return false - } - } - return true -} - -// splitQuoted splits the string s around each instance of one or more consecutive -// white space characters while taking into account quotes and escaping, and -// returns an array of substrings of s or an empty list if s contains only white space. -// Single quotes and double quotes are recognized to prevent splitting within the -// quoted region, and are removed from the resulting substrings. If a quote in s -// isn't closed err will be set and r will have the unclosed argument as the -// last element. The backslash is used for escaping. -// -// For example, the following string: -// -// a b:"c d" 'e''f' "g\"" -// -// Would be parsed as: -// -// []string{"a", "b:c d", "ef", `g"`} -func splitQuoted(s string) (r []string, err error) { - var args []string - arg := make([]rune, len(s)) - escaped := false - quoted := false - quote := '\x00' - i := 0 - for _, rune := range s { - switch { - case escaped: - escaped = false - case rune == '\\': - escaped = true - continue - case quote != '\x00': - if rune == quote { - quote = '\x00' - continue - } - case rune == '"' || rune == '\'': - quoted = true - quote = rune - continue - case unicode.IsSpace(rune): - if quoted || i > 0 { - quoted = false - args = append(args, string(arg[:i])) - i = 0 - } - continue - } - arg[i] = rune - i++ - } - if quoted || i > 0 { - args = append(args, string(arg[:i])) - } - if quote != 0 { - err = errors.New("unclosed quote") - } else if escaped { - err = errors.New("unfinished escaping") - } - return args, err -} - -// matchAuto interprets text as either a +build or //go:build expression (whichever works), -// reporting whether the expression matches the build context. -// -// matchAuto is only used for testing of tag evaluation -// and in #cgo lines, which accept either syntax. -func (ctxt *Context) matchAuto(text string, allTags map[string]bool) bool { - if strings.ContainsAny(text, "&|()") { - text = "//go:build " + text - } else { - text = "// +build " + text - } - x, err := constraint.Parse(text) - if err != nil { - return false - } - return ctxt.eval(x, allTags) -} - -func (ctxt *Context) eval(x constraint.Expr, allTags map[string]bool) bool { - return x.Eval(func(tag string) bool { return ctxt.matchTag(tag, allTags) }) -} - -// matchTag reports whether the name is one of: -// -// cgo (if cgo is enabled) -// $GOOS -// $GOARCH -// ctxt.Compiler -// linux (if GOOS = android) -// solaris (if GOOS = illumos) -// tag (if tag is listed in ctxt.BuildTags or ctxt.ReleaseTags) -// -// It records all consulted tags in allTags. -func (ctxt *Context) matchTag(name string, allTags map[string]bool) bool { - if allTags != nil { - allTags[name] = true - } - - // special tags - if ctxt.CgoEnabled && name == "cgo" { - return true - } - if name == ctxt.GOOS || name == ctxt.GOARCH || name == ctxt.Compiler { - return true - } - if ctxt.GOOS == "android" && name == "linux" { - return true - } - if ctxt.GOOS == "illumos" && name == "solaris" { - return true - } - if ctxt.GOOS == "ios" && name == "darwin" { - return true - } - - // other tags - for _, tag := range ctxt.BuildTags { - if tag == name { - return true - } - } - for _, tag := range ctxt.ToolTags { - if tag == name { - return true - } - } - for _, tag := range ctxt.ReleaseTags { - if tag == name { - return true - } - } - - return false -} - -// goodOSArchFile returns false if the name contains a $GOOS or $GOARCH -// suffix which does not match the current system. -// The recognized name formats are: -// -// name_$(GOOS).* -// name_$(GOARCH).* -// name_$(GOOS)_$(GOARCH).* -// name_$(GOOS)_test.* -// name_$(GOARCH)_test.* -// name_$(GOOS)_$(GOARCH)_test.* -// -// Exceptions: -// if GOOS=android, then files with GOOS=linux are also matched. -// if GOOS=illumos, then files with GOOS=solaris are also matched. -// if GOOS=ios, then files with GOOS=darwin are also matched. -func (ctxt *Context) goodOSArchFile(name string, allTags map[string]bool) bool { - name, _, _ = stringsCut(name, ".") - - // Before Go 1.4, a file called "linux.go" would be equivalent to having a - // build tag "linux" in that file. For Go 1.4 and beyond, we require this - // auto-tagging to apply only to files with a non-empty prefix, so - // "foo_linux.go" is tagged but "linux.go" is not. This allows new operating - // systems, such as android, to arrive without breaking existing code with - // innocuous source code in "android.go". The easiest fix: cut everything - // in the name before the initial _. - i := strings.Index(name, "_") - if i < 0 { - return true - } - name = name[i:] // ignore everything before first _ - - l := strings.Split(name, "_") - if n := len(l); n > 0 && l[n-1] == "test" { - l = l[:n-1] - } - n := len(l) - if n >= 2 && knownOS[l[n-2]] && knownArch[l[n-1]] { - return ctxt.matchTag(l[n-1], allTags) && ctxt.matchTag(l[n-2], allTags) - } - if n >= 1 && (knownOS[l[n-1]] || knownArch[l[n-1]]) { - return ctxt.matchTag(l[n-1], allTags) - } - return true -} - -var knownOS = make(map[string]bool) -var knownArch = make(map[string]bool) - -func init() { - for _, v := range strings.Fields(goosList) { - knownOS[v] = true - } - for _, v := range strings.Fields(goarchList) { - knownArch[v] = true - } -} - -// ToolDir is the directory containing build tools. -var ToolDir = getToolDir() - -// IsLocalImport reports whether the import path is -// a local import path, like ".", "..", "./foo", or "../foo". -func IsLocalImport(path string) bool { - return path == "." || path == ".." || - strings.HasPrefix(path, "./") || strings.HasPrefix(path, "../") -} - -// ArchChar returns "?" and an error. -// In earlier versions of Go, the returned string was used to derive -// the compiler and linker tool names, the default object file suffix, -// and the default linker output name. As of Go 1.5, those strings -// no longer vary by architecture; they are compile, link, .o, and a.out, respectively. -func ArchChar(goarch string) (string, error) { - return "?", errors.New("architecture letter no longer used") -} - -func bytesCut(s, sep []byte) (before, after []byte, found bool) { - if i := bytes.Index(s, sep); i >= 0 { - return s[:i], s[i+len(sep):], true - } - return s, nil, false -} - -func stringsCut(s, sep string) (before, after string, found bool) { - if i := strings.Index(s, sep); i >= 0 { - return s[:i], s[i+len(sep):], true - } - return s, "", false -} diff --git a/internal/backport/go/build/doc.go b/internal/backport/go/build/doc.go deleted file mode 100644 index 262f6709af..0000000000 --- a/internal/backport/go/build/doc.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package build gathers information about Go packages. -// -// # Go Path -// -// The Go path is a list of directory trees containing Go source code. -// It is consulted to resolve imports that cannot be found in the standard -// Go tree. The default path is the value of the GOPATH environment -// variable, interpreted as a path list appropriate to the operating system -// (on Unix, the variable is a colon-separated string; -// on Windows, a semicolon-separated string; -// on Plan 9, a list). -// -// Each directory listed in the Go path must have a prescribed structure: -// -// The src/ directory holds source code. The path below 'src' determines -// the import path or executable name. -// -// The pkg/ directory holds installed package objects. -// As in the Go tree, each target operating system and -// architecture pair has its own subdirectory of pkg -// (pkg/GOOS_GOARCH). -// -// If DIR is a directory listed in the Go path, a package with -// source in DIR/src/foo/bar can be imported as "foo/bar" and -// has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a" -// (or, for gccgo, "DIR/pkg/gccgo/foo/libbar.a"). -// -// The bin/ directory holds compiled commands. -// Each command is named for its source directory, but only -// using the final element, not the entire path. That is, the -// command with source in DIR/src/foo/quux is installed into -// DIR/bin/quux, not DIR/bin/foo/quux. The foo/ is stripped -// so that you can add DIR/bin to your PATH to get at the -// installed commands. -// -// Here's an example directory layout: -// -// GOPATH=/home/user/gocode -// -// /home/user/gocode/ -// src/ -// foo/ -// bar/ (go code in package bar) -// x.go -// quux/ (go code in package main) -// y.go -// bin/ -// quux (installed command) -// pkg/ -// linux_amd64/ -// foo/ -// bar.a (installed package object) -// -// # Build Constraints -// -// A build constraint, also known as a build tag, is a line comment that begins -// -// //go:build -// -// that lists the conditions under which a file should be included in the -// package. Build constraints may also be part of a file's name -// (for example, source_windows.go will only be included if the target -// operating system is windows). -// -// See 'go help buildconstraint' -// (https://golang.org/cmd/go/#hdr-Build_constraints) for details. -// -// # Binary-Only Packages -// -// In Go 1.12 and earlier, it was possible to distribute packages in binary -// form without including the source code used for compiling the package. -// The package was distributed with a source file not excluded by build -// constraints and containing a "//go:binary-only-package" comment. Like a -// build constraint, this comment appeared at the top of a file, preceded -// only by blank lines and other line comments and with a blank line -// following the comment, to separate it from the package documentation. -// Unlike build constraints, this comment is only recognized in non-test -// Go source files. -// -// The minimal source code for a binary-only package was therefore: -// -// //go:binary-only-package -// -// package mypkg -// -// The source code could include additional Go code. That code was never -// compiled but would be processed by tools like godoc and might be useful -// as end-user documentation. -// -// "go build" and other commands no longer support binary-only-packages. -// Import and ImportDir will still set the BinaryOnly flag in packages -// containing these comments for use in tools and error messages. -package build diff --git a/internal/backport/go/build/gc.go b/internal/backport/go/build/gc.go deleted file mode 100644 index e16e186e0d..0000000000 --- a/internal/backport/go/build/gc.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build gc -// +build gc - -package build - -import ( - "path/filepath" - "runtime" -) - -// getToolDir returns the default value of ToolDir. -func getToolDir() string { - return filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) -} diff --git a/internal/backport/go/build/gccgo.go b/internal/backport/go/build/gccgo.go deleted file mode 100644 index c8ec7041fb..0000000000 --- a/internal/backport/go/build/gccgo.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build gccgo -// +build gccgo - -package build - -import "runtime" - -// getToolDir returns the default value of ToolDir. -func getToolDir() string { - return envOr("GCCGOTOOLDIR", runtime.GCCGOTOOLDIR) -} diff --git a/internal/backport/go/build/read.go b/internal/backport/go/build/read.go deleted file mode 100644 index e8fe9a08b2..0000000000 --- a/internal/backport/go/build/read.go +++ /dev/null @@ -1,578 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" - "io" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -type importReader struct { - b *bufio.Reader - buf []byte - peek byte - err error - eof bool - nerr int - pos token.Position -} - -var bom = []byte{0xef, 0xbb, 0xbf} - -func newImportReader(name string, r io.Reader) *importReader { - b := bufio.NewReader(r) - // Remove leading UTF-8 BOM. - // Per https://golang.org/ref/spec#Source_code_representation: - // a compiler may ignore a UTF-8-encoded byte order mark (U+FEFF) - // if it is the first Unicode code point in the source text. - if leadingBytes, err := b.Peek(3); err == nil && bytes.Equal(leadingBytes, bom) { - b.Discard(3) - } - return &importReader{ - b: b, - pos: token.Position{ - Filename: name, - Line: 1, - Column: 1, - }, - } -} - -func isIdent(c byte) bool { - return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '_' || c >= utf8.RuneSelf -} - -var ( - errSyntax = errors.New("syntax error") - errNUL = errors.New("unexpected NUL in input") -) - -// syntaxError records a syntax error, but only if an I/O error has not already been recorded. -func (r *importReader) syntaxError() { - if r.err == nil { - r.err = errSyntax - } -} - -// readByte reads the next byte from the input, saves it in buf, and returns it. -// If an error occurs, readByte records the error in r.err and returns 0. -func (r *importReader) readByte() byte { - c, err := r.b.ReadByte() - if err == nil { - r.buf = append(r.buf, c) - if c == 0 { - err = errNUL - } - } - if err != nil { - if err == io.EOF { - r.eof = true - } else if r.err == nil { - r.err = err - } - c = 0 - } - return c -} - -// readByteNoBuf is like readByte but doesn't buffer the byte. -// It exhausts r.buf before reading from r.b. -func (r *importReader) readByteNoBuf() byte { - var c byte - var err error - if len(r.buf) > 0 { - c = r.buf[0] - r.buf = r.buf[1:] - } else { - c, err = r.b.ReadByte() - if err == nil && c == 0 { - err = errNUL - } - } - - if err != nil { - if err == io.EOF { - r.eof = true - } else if r.err == nil { - r.err = err - } - return 0 - } - r.pos.Offset++ - if c == '\n' { - r.pos.Line++ - r.pos.Column = 1 - } else { - r.pos.Column++ - } - return c -} - -// peekByte returns the next byte from the input reader but does not advance beyond it. -// If skipSpace is set, peekByte skips leading spaces and comments. -func (r *importReader) peekByte(skipSpace bool) byte { - if r.err != nil { - if r.nerr++; r.nerr > 10000 { - panic("go/build: import reader looping") - } - return 0 - } - - // Use r.peek as first input byte. - // Don't just return r.peek here: it might have been left by peekByte(false) - // and this might be peekByte(true). - c := r.peek - if c == 0 { - c = r.readByte() - } - for r.err == nil && !r.eof { - if skipSpace { - // For the purposes of this reader, semicolons are never necessary to - // understand the input and are treated as spaces. - switch c { - case ' ', '\f', '\t', '\r', '\n', ';': - c = r.readByte() - continue - - case '/': - c = r.readByte() - if c == '/' { - for c != '\n' && r.err == nil && !r.eof { - c = r.readByte() - } - } else if c == '*' { - var c1 byte - for (c != '*' || c1 != '/') && r.err == nil { - if r.eof { - r.syntaxError() - } - c, c1 = c1, r.readByte() - } - } else { - r.syntaxError() - } - c = r.readByte() - continue - } - } - break - } - r.peek = c - return r.peek -} - -// nextByte is like peekByte but advances beyond the returned byte. -func (r *importReader) nextByte(skipSpace bool) byte { - c := r.peekByte(skipSpace) - r.peek = 0 - return c -} - -var goEmbed = []byte("go:embed") - -// findEmbed advances the input reader to the next //go:embed comment. -// It reports whether it found a comment. -// (Otherwise it found an error or EOF.) -func (r *importReader) findEmbed(first bool) bool { - // The import block scan stopped after a non-space character, - // so the reader is not at the start of a line on the first call. - // After that, each //go:embed extraction leaves the reader - // at the end of a line. - startLine := !first - var c byte - for r.err == nil && !r.eof { - c = r.readByteNoBuf() - Reswitch: - switch c { - default: - startLine = false - - case '\n': - startLine = true - - case ' ', '\t': - // leave startLine alone - - case '"': - startLine = false - for r.err == nil { - if r.eof { - r.syntaxError() - } - c = r.readByteNoBuf() - if c == '\\' { - r.readByteNoBuf() - if r.err != nil { - r.syntaxError() - return false - } - continue - } - if c == '"' { - c = r.readByteNoBuf() - goto Reswitch - } - } - goto Reswitch - - case '`': - startLine = false - for r.err == nil { - if r.eof { - r.syntaxError() - } - c = r.readByteNoBuf() - if c == '`' { - c = r.readByteNoBuf() - goto Reswitch - } - } - - case '\'': - startLine = false - for r.err == nil { - if r.eof { - r.syntaxError() - } - c = r.readByteNoBuf() - if c == '\\' { - r.readByteNoBuf() - if r.err != nil { - r.syntaxError() - return false - } - continue - } - if c == '\'' { - c = r.readByteNoBuf() - goto Reswitch - } - } - - case '/': - c = r.readByteNoBuf() - switch c { - default: - startLine = false - goto Reswitch - - case '*': - var c1 byte - for (c != '*' || c1 != '/') && r.err == nil { - if r.eof { - r.syntaxError() - } - c, c1 = c1, r.readByteNoBuf() - } - startLine = false - - case '/': - if startLine { - // Try to read this as a //go:embed comment. - for i := range goEmbed { - c = r.readByteNoBuf() - if c != goEmbed[i] { - goto SkipSlashSlash - } - } - c = r.readByteNoBuf() - if c == ' ' || c == '\t' { - // Found one! - return true - } - } - SkipSlashSlash: - for c != '\n' && r.err == nil && !r.eof { - c = r.readByteNoBuf() - } - startLine = true - } - } - } - return false -} - -// readKeyword reads the given keyword from the input. -// If the keyword is not present, readKeyword records a syntax error. -func (r *importReader) readKeyword(kw string) { - r.peekByte(true) - for i := 0; i < len(kw); i++ { - if r.nextByte(false) != kw[i] { - r.syntaxError() - return - } - } - if isIdent(r.peekByte(false)) { - r.syntaxError() - } -} - -// readIdent reads an identifier from the input. -// If an identifier is not present, readIdent records a syntax error. -func (r *importReader) readIdent() { - c := r.peekByte(true) - if !isIdent(c) { - r.syntaxError() - return - } - for isIdent(r.peekByte(false)) { - r.peek = 0 - } -} - -// readString reads a quoted string literal from the input. -// If an identifier is not present, readString records a syntax error. -func (r *importReader) readString() { - switch r.nextByte(true) { - case '`': - for r.err == nil { - if r.nextByte(false) == '`' { - break - } - if r.eof { - r.syntaxError() - } - } - case '"': - for r.err == nil { - c := r.nextByte(false) - if c == '"' { - break - } - if r.eof || c == '\n' { - r.syntaxError() - } - if c == '\\' { - r.nextByte(false) - } - } - default: - r.syntaxError() - } -} - -// readImport reads an import clause - optional identifier followed by quoted string - -// from the input. -func (r *importReader) readImport() { - c := r.peekByte(true) - if c == '.' { - r.peek = 0 - } else if isIdent(c) { - r.readIdent() - } - r.readString() -} - -// readComments is like io.ReadAll, except that it only reads the leading -// block of comments in the file. -func readComments(f io.Reader) ([]byte, error) { - r := newImportReader("", f) - r.peekByte(true) - if r.err == nil && !r.eof { - // Didn't reach EOF, so must have found a non-space byte. Remove it. - r.buf = r.buf[:len(r.buf)-1] - } - return r.buf, r.err -} - -// readGoInfo expects a Go file as input and reads the file up to and including the import section. -// It records what it learned in *info. -// If info.fset is non-nil, readGoInfo parses the file and sets info.parsed, info.parseErr, -// info.imports, info.embeds, and info.embedErr. -// -// It only returns an error if there are problems reading the file, -// not for syntax errors in the file itself. -func readGoInfo(f io.Reader, info *fileInfo) error { - r := newImportReader(info.name, f) - - r.readKeyword("package") - r.readIdent() - for r.peekByte(true) == 'i' { - r.readKeyword("import") - if r.peekByte(true) == '(' { - r.nextByte(false) - for r.peekByte(true) != ')' && r.err == nil { - r.readImport() - } - r.nextByte(false) - } else { - r.readImport() - } - } - - info.header = r.buf - - // If we stopped successfully before EOF, we read a byte that told us we were done. - // Return all but that last byte, which would cause a syntax error if we let it through. - if r.err == nil && !r.eof { - info.header = r.buf[:len(r.buf)-1] - } - - // If we stopped for a syntax error, consume the whole file so that - // we are sure we don't change the errors that go/parser returns. - if r.err == errSyntax { - r.err = nil - for r.err == nil && !r.eof { - r.readByte() - } - info.header = r.buf - } - if r.err != nil { - return r.err - } - - if info.fset == nil { - return nil - } - - // Parse file header & record imports. - info.parsed, info.parseErr = parser.ParseFile(info.fset, info.name, info.header, parser.ImportsOnly|parser.ParseComments) - if info.parseErr != nil { - return nil - } - - hasEmbed := false - for _, decl := range info.parsed.Decls { - d, ok := decl.(*ast.GenDecl) - if !ok { - continue - } - for _, dspec := range d.Specs { - spec, ok := dspec.(*ast.ImportSpec) - if !ok { - continue - } - quoted := spec.Path.Value - path, err := strconv.Unquote(quoted) - if err != nil { - return fmt.Errorf("parser returned invalid quoted string: <%s>", quoted) - } - if path == "embed" { - hasEmbed = true - } - - doc := spec.Doc - if doc == nil && len(d.Specs) == 1 { - doc = d.Doc - } - info.imports = append(info.imports, fileImport{path, spec.Pos(), doc}) - } - } - - // If the file imports "embed", - // we have to look for //go:embed comments - // in the remainder of the file. - // The compiler will enforce the mapping of comments to - // declared variables. We just need to know the patterns. - // If there were //go:embed comments earlier in the file - // (near the package statement or imports), the compiler - // will reject them. They can be (and have already been) ignored. - if hasEmbed { - var line []byte - for first := true; r.findEmbed(first); first = false { - line = line[:0] - pos := r.pos - for { - c := r.readByteNoBuf() - if c == '\n' || r.err != nil || r.eof { - break - } - line = append(line, c) - } - // Add args if line is well-formed. - // Ignore badly-formed lines - the compiler will report them when it finds them, - // and we can pretend they are not there to help go list succeed with what it knows. - embs, err := parseGoEmbed(string(line), pos) - if err == nil { - info.embeds = append(info.embeds, embs...) - } - } - } - - return nil -} - -// parseGoEmbed parses the text following "//go:embed" to extract the glob patterns. -// It accepts unquoted space-separated patterns as well as double-quoted and back-quoted Go strings. -// This is based on a similar function in cmd/compile/internal/gc/noder.go; -// this version calculates position information as well. -func parseGoEmbed(args string, pos token.Position) ([]fileEmbed, error) { - trimBytes := func(n int) { - pos.Offset += n - pos.Column += utf8.RuneCountInString(args[:n]) - args = args[n:] - } - trimSpace := func() { - trim := strings.TrimLeftFunc(args, unicode.IsSpace) - trimBytes(len(args) - len(trim)) - } - - var list []fileEmbed - for trimSpace(); args != ""; trimSpace() { - var path string - pathPos := pos - Switch: - switch args[0] { - default: - i := len(args) - for j, c := range args { - if unicode.IsSpace(c) { - i = j - break - } - } - path = args[:i] - trimBytes(i) - - case '`': - var ok bool - path, _, ok = stringsCut(args[1:], "`") - if !ok { - return nil, fmt.Errorf("invalid quoted string in //go:embed: %s", args) - } - trimBytes(1 + len(path) + 1) - - case '"': - i := 1 - for ; i < len(args); i++ { - if args[i] == '\\' { - i++ - continue - } - if args[i] == '"' { - q, err := strconv.Unquote(args[:i+1]) - if err != nil { - return nil, fmt.Errorf("invalid quoted string in //go:embed: %s", args[:i+1]) - } - path = q - trimBytes(i + 1) - break Switch - } - } - if i >= len(args) { - return nil, fmt.Errorf("invalid quoted string in //go:embed: %s", args) - } - } - - if args != "" { - r, _ := utf8.DecodeRuneInString(args) - if !unicode.IsSpace(r) { - return nil, fmt.Errorf("invalid quoted string in //go:embed: %s", args) - } - } - list = append(list, fileEmbed{path, pathPos}) - } - return list, nil -} diff --git a/internal/backport/go/build/read_test.go b/internal/backport/go/build/read_test.go deleted file mode 100644 index f15b153017..0000000000 --- a/internal/backport/go/build/read_test.go +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "fmt" - "io" - "strings" - "testing" - - "golang.org/x/website/internal/backport/go/token" -) - -const quote = "`" - -type readTest struct { - // Test input contains ℙ where readGoInfo should stop. - in string - err string -} - -var readGoInfoTests = []readTest{ - { - `package p`, - "", - }, - { - `package p; import "x"`, - "", - }, - { - `package p; import . "x"`, - "", - }, - { - `package p; import "x";ℙvar x = 1`, - "", - }, - { - `package p - - // comment - - import "x" - import _ "x" - import a "x" - - /* comment */ - - import ( - "x" /* comment */ - _ "x" - a "x" // comment - ` + quote + `x` + quote + ` - _ /*comment*/ ` + quote + `x` + quote + ` - a ` + quote + `x` + quote + ` - ) - import ( - ) - import () - import()import()import() - import();import();import() - - ℙvar x = 1 - `, - "", - }, - { - "\ufeff𝔻" + `package p; import "x";ℙvar x = 1`, - "", - }, -} - -var readCommentsTests = []readTest{ - { - `ℙpackage p`, - "", - }, - { - `ℙpackage p; import "x"`, - "", - }, - { - `ℙpackage p; import . "x"`, - "", - }, - { - "\ufeff𝔻" + `ℙpackage p; import . "x"`, - "", - }, - { - `// foo - - /* bar */ - - /* quux */ // baz - - /*/ zot */ - - // asdf - ℙHello, world`, - "", - }, - { - "\ufeff𝔻" + `// foo - - /* bar */ - - /* quux */ // baz - - /*/ zot */ - - // asdf - ℙHello, world`, - "", - }, -} - -func testRead(t *testing.T, tests []readTest, read func(io.Reader) ([]byte, error)) { - for i, tt := range tests { - beforeP, afterP, _ := stringsCut1(tt.in, "ℙ") - in := beforeP + afterP - testOut := beforeP - - if beforeD, afterD, ok := stringsCut1(beforeP, "𝔻"); ok { - in = beforeD + afterD + afterP - testOut = afterD - } - - r := strings.NewReader(in) - buf, err := read(r) - if err != nil { - if tt.err == "" { - t.Errorf("#%d: err=%q, expected success (%q)", i, err, string(buf)) - } else if !strings.Contains(err.Error(), tt.err) { - t.Errorf("#%d: err=%q, expected %q", i, err, tt.err) - } - continue - } - if tt.err != "" { - t.Errorf("#%d: success, expected %q", i, tt.err) - continue - } - - out := string(buf) - if out != testOut { - t.Errorf("#%d: wrong output:\nhave %q\nwant %q\n", i, out, testOut) - } - } -} - -func TestReadGoInfo(t *testing.T) { - testRead(t, readGoInfoTests, func(r io.Reader) ([]byte, error) { - var info fileInfo - err := readGoInfo(r, &info) - return info.header, err - }) -} - -func TestReadComments(t *testing.T) { - testRead(t, readCommentsTests, readComments) -} - -var readFailuresTests = []readTest{ - { - `package`, - "syntax error", - }, - { - "package p\n\x00\nimport `math`\n", - "unexpected NUL in input", - }, - { - `package p; import`, - "syntax error", - }, - { - `package p; import "`, - "syntax error", - }, - { - "package p; import ` \n\n", - "syntax error", - }, - { - `package p; import "x`, - "syntax error", - }, - { - `package p; import _`, - "syntax error", - }, - { - `package p; import _ "`, - "syntax error", - }, - { - `package p; import _ "x`, - "syntax error", - }, - { - `package p; import .`, - "syntax error", - }, - { - `package p; import . "`, - "syntax error", - }, - { - `package p; import . "x`, - "syntax error", - }, - { - `package p; import (`, - "syntax error", - }, - { - `package p; import ("`, - "syntax error", - }, - { - `package p; import ("x`, - "syntax error", - }, - { - `package p; import ("x"`, - "syntax error", - }, -} - -func TestReadFailuresIgnored(t *testing.T) { - // Syntax errors should not be reported (false arg to readImports). - // Instead, entire file should be the output and no error. - // Convert tests not to return syntax errors. - tests := make([]readTest, len(readFailuresTests)) - copy(tests, readFailuresTests) - for i := range tests { - tt := &tests[i] - if !strings.Contains(tt.err, "NUL") { - tt.err = "" - } - } - testRead(t, tests, func(r io.Reader) ([]byte, error) { - var info fileInfo - err := readGoInfo(r, &info) - return info.header, err - }) -} - -var readEmbedTests = []struct { - in, out string -}{ - { - "package p\n", - "", - }, - { - "package p\nimport \"embed\"\nvar i int\n//go:embed x y z\nvar files embed.FS", - `test:4:12:x - test:4:14:y - test:4:16:z`, - }, - { - "package p\nimport \"embed\"\nvar i int\n//go:embed x \"\\x79\" `z`\nvar files embed.FS", - `test:4:12:x - test:4:14:y - test:4:21:z`, - }, - { - "package p\nimport \"embed\"\nvar i int\n//go:embed x y\n//go:embed z\nvar files embed.FS", - `test:4:12:x - test:4:14:y - test:5:12:z`, - }, - { - "package p\nimport \"embed\"\nvar i int\n\t //go:embed x y\n\t //go:embed z\n\t var files embed.FS", - `test:4:14:x - test:4:16:y - test:5:14:z`, - }, - { - "package p\nimport \"embed\"\n//go:embed x y z\nvar files embed.FS", - `test:3:12:x - test:3:14:y - test:3:16:z`, - }, - { - "\ufeffpackage p\nimport \"embed\"\n//go:embed x y z\nvar files embed.FS", - `test:3:12:x - test:3:14:y - test:3:16:z`, - }, - { - "package p\nimport \"embed\"\nvar s = \"/*\"\n//go:embed x\nvar files embed.FS", - `test:4:12:x`, - }, - { - `package p - import "embed" - var s = "\"\\\\" - //go:embed x - var files embed.FS`, - `test:4:15:x`, - }, - { - "package p\nimport \"embed\"\nvar s = `/*`\n//go:embed x\nvar files embed.FS", - `test:4:12:x`, - }, - { - "package p\nimport \"embed\"\nvar s = z/ *y\n//go:embed pointer\nvar pointer embed.FS", - "test:4:12:pointer", - }, - { - "package p\n//go:embed x y z\n", // no import, no scan - "", - }, - { - "package p\n//go:embed x y z\nvar files embed.FS", // no import, no scan - "", - }, - { - "\ufeffpackage p\n//go:embed x y z\nvar files embed.FS", // no import, no scan - "", - }, -} - -func TestReadEmbed(t *testing.T) { - fset := token.NewFileSet() - for i, tt := range readEmbedTests { - info := fileInfo{ - name: "test", - fset: fset, - } - err := readGoInfo(strings.NewReader(tt.in), &info) - if err != nil { - t.Errorf("#%d: %v", i, err) - continue - } - b := &strings.Builder{} - sep := "" - for _, emb := range info.embeds { - fmt.Fprintf(b, "%s%v:%s", sep, emb.pos, emb.pattern) - sep = "\n" - } - got := b.String() - want := strings.Join(strings.Fields(tt.out), "\n") - if got != want { - t.Errorf("#%d: embeds:\n%s\nwant:\n%s", i, got, want) - } - } -} - -func stringsCut1(s, sep string) (before, after string, found bool) { - if i := strings.Index(s, sep); i >= 0 { - return s[:i], s[i+len(sep):], true - } - return s, "", false -} diff --git a/internal/backport/go/build/syslist.go b/internal/backport/go/build/syslist.go deleted file mode 100644 index 0f6e336925..0000000000 --- a/internal/backport/go/build/syslist.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -// List of past, present, and future known GOOS and GOARCH values. -// Do not remove from this list, as these are used for go/build filename matching. - -const goosList = "aix android darwin dragonfly freebsd hurd illumos ios js linux nacl netbsd openbsd plan9 solaris windows zos " -const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be loong64 mips mipsle mips64 mips64le mips64p32 mips64p32le ppc ppc64 ppc64le riscv riscv64 s390 s390x sparc sparc64 wasm " diff --git a/internal/backport/go/build/syslist_test.go b/internal/backport/go/build/syslist_test.go deleted file mode 100644 index 2b7b4c71aa..0000000000 --- a/internal/backport/go/build/syslist_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "runtime" - "testing" -) - -var ( - thisOS = runtime.GOOS - thisArch = runtime.GOARCH - otherOS = anotherOS() - otherArch = anotherArch() -) - -func anotherOS() string { - if thisOS != "darwin" && thisOS != "ios" { - return "darwin" - } - return "linux" -} - -func anotherArch() string { - if thisArch != "amd64" { - return "amd64" - } - return "386" -} - -type GoodFileTest struct { - name string - result bool -} - -var tests = []GoodFileTest{ - {"file.go", true}, - {"file.c", true}, - {"file_foo.go", true}, - {"file_" + thisArch + ".go", true}, - {"file_" + otherArch + ".go", false}, - {"file_" + thisOS + ".go", true}, - {"file_" + otherOS + ".go", false}, - {"file_" + thisOS + "_" + thisArch + ".go", true}, - {"file_" + otherOS + "_" + thisArch + ".go", false}, - {"file_" + thisOS + "_" + otherArch + ".go", false}, - {"file_" + otherOS + "_" + otherArch + ".go", false}, - {"file_foo_" + thisArch + ".go", true}, - {"file_foo_" + otherArch + ".go", false}, - {"file_" + thisOS + ".c", true}, - {"file_" + otherOS + ".c", false}, -} - -func TestGoodOSArch(t *testing.T) { - for _, test := range tests { - if Default.goodOSArchFile(test.name, make(map[string]bool)) != test.result { - t.Fatalf("goodOSArchFile(%q) != %v", test.name, test.result) - } - } -} diff --git a/internal/backport/go/doc/Makefile b/internal/backport/go/doc/Makefile deleted file mode 100644 index ca4948f91c..0000000000 --- a/internal/backport/go/doc/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -# Script to test heading detection heuristic -headscan: headscan.go - go build headscan.go diff --git a/internal/backport/go/doc/comment.go b/internal/backport/go/doc/comment.go deleted file mode 100644 index 6cf5926eb2..0000000000 --- a/internal/backport/go/doc/comment.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import ( - "io" - - "golang.org/x/website/internal/backport/go/doc/comment" -) - -// ToHTML converts comment text to formatted HTML. -// -// Deprecated: ToHTML cannot identify documentation links -// in the doc comment, because they depend on knowing what -// package the text came from, which is not included in this API. -// -// Given the *[doc.Package] p where text was found, -// ToHTML(w, text, nil) can be replaced by: -// -// w.Write(p.HTML(text)) -// -// which is in turn shorthand for: -// -// w.Write(p.Printer().HTML(p.Parser().Parse(text))) -// -// If words may be non-nil, the longer replacement is: -// -// parser := p.Parser() -// parser.Words = words -// w.Write(p.Printer().HTML(parser.Parse(d))) -func ToHTML(w io.Writer, text string, words map[string]string) { - p := new(Package).Parser() - p.Words = words - d := p.Parse(text) - pr := new(comment.Printer) - w.Write(pr.HTML(d)) -} - -// ToText converts comment text to formatted text. -// -// Deprecated: ToText cannot identify documentation links -// in the doc comment, because they depend on knowing what -// package the text came from, which is not included in this API. -// -// Given the *[doc.Package] p where text was found, -// ToText(w, text, "", "\t", 80) can be replaced by: -// -// w.Write(p.Text(text)) -// -// In the general case, ToText(w, text, prefix, codePrefix, width) -// can be replaced by: -// -// d := p.Parser().Parse(text) -// pr := p.Printer() -// pr.TextPrefix = prefix -// pr.TextCodePrefix = codePrefix -// pr.TextWidth = width -// w.Write(pr.Text(d)) -// -// See the documentation for [Package.Text] and [comment.Printer.Text] -// for more details. -func ToText(w io.Writer, text string, prefix, codePrefix string, width int) { - d := new(Package).Parser().Parse(text) - pr := &comment.Printer{ - TextPrefix: prefix, - TextCodePrefix: codePrefix, - TextWidth: width, - } - w.Write(pr.Text(d)) -} diff --git a/internal/backport/go/doc/comment/doc.go b/internal/backport/go/doc/comment/doc.go deleted file mode 100644 index 45a476aa9a..0000000000 --- a/internal/backport/go/doc/comment/doc.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package comment implements parsing and reformatting of Go doc comments, -(documentation comments), which are comments that immediately precede -a top-level declaration of a package, const, func, type, or var. - -Go doc comment syntax is a simplified subset of Markdown that supports -links, headings, paragraphs, lists (without nesting), and preformatted text blocks. -The details of the syntax are documented at https://go.dev/doc/comment. - -To parse the text associated with a doc comment (after removing comment markers), -use a [Parser]: - - var p comment.Parser - doc := p.Parse(text) - -The result is a [*Doc]. -To reformat it as a doc comment, HTML, Markdown, or plain text, -use a [Printer]: - - var pr comment.Printer - os.Stdout.Write(pr.Text(doc)) - -The [Parser] and [Printer] types are structs whose fields can be -modified to customize the operations. -For details, see the documentation for those types. - -Use cases that need additional control over reformatting can -implement their own logic by inspecting the parsed syntax itself. -See the documentation for [Doc], [Block], [Text] for an overview -and links to additional types. -*/ -package comment diff --git a/internal/backport/go/doc/comment/html.go b/internal/backport/go/doc/comment/html.go deleted file mode 100644 index bc076f6a58..0000000000 --- a/internal/backport/go/doc/comment/html.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "bytes" - "fmt" - "strconv" -) - -// An htmlPrinter holds the state needed for printing a Doc as HTML. -type htmlPrinter struct { - *Printer - tight bool -} - -// HTML returns an HTML formatting of the Doc. -// See the [Printer] documentation for ways to customize the HTML output. -func (p *Printer) HTML(d *Doc) []byte { - hp := &htmlPrinter{Printer: p} - var out bytes.Buffer - for _, x := range d.Content { - hp.block(&out, x) - } - return out.Bytes() -} - -// block prints the block x to out. -func (p *htmlPrinter) block(out *bytes.Buffer, x Block) { - switch x := x.(type) { - default: - fmt.Fprintf(out, "?%T", x) - - case *Paragraph: - if !p.tight { - out.WriteString("

") - } - p.text(out, x.Text) - out.WriteString("\n") - - case *Heading: - out.WriteString("") - p.text(out, x.Text) - out.WriteString("\n") - - case *Code: - out.WriteString("

")
-		p.escape(out, x.Text)
-		out.WriteString("
\n") - - case *List: - kind := "ol>\n" - if x.Items[0].Number == "" { - kind = "ul>\n" - } - out.WriteString("<") - out.WriteString(kind) - next := "1" - for _, item := range x.Items { - out.WriteString("") - p.tight = !x.BlankBetween() - for _, blk := range item.Content { - p.block(out, blk) - } - p.tight = false - } - out.WriteString("= 0; i-- { - if b[i] < '9' { - b[i]++ - return string(b) - } - b[i] = '0' - } - return "1" + string(b) -} - -// text prints the text sequence x to out. -func (p *htmlPrinter) text(out *bytes.Buffer, x []Text) { - for _, t := range x { - switch t := t.(type) { - case Plain: - p.escape(out, string(t)) - case Italic: - out.WriteString("") - p.escape(out, string(t)) - out.WriteString("") - case *Link: - out.WriteString(``) - p.text(out, t.Text) - out.WriteString("") - case *DocLink: - url := p.docLinkURL(t) - if url != "" { - out.WriteString(``) - } - p.text(out, t.Text) - if url != "" { - out.WriteString("") - } - } - } -} - -// escape prints s to out as plain text, -// escaping < & " ' and > to avoid being misinterpreted -// in larger HTML constructs. -func (p *htmlPrinter) escape(out *bytes.Buffer, s string) { - start := 0 - for i := 0; i < len(s); i++ { - switch s[i] { - case '<': - out.WriteString(s[start:i]) - out.WriteString("<") - start = i + 1 - case '&': - out.WriteString(s[start:i]) - out.WriteString("&") - start = i + 1 - case '"': - out.WriteString(s[start:i]) - out.WriteString(""") - start = i + 1 - case '\'': - out.WriteString(s[start:i]) - out.WriteString("'") - start = i + 1 - case '>': - out.WriteString(s[start:i]) - out.WriteString(">") - start = i + 1 - } - } - out.WriteString(s[start:]) -} diff --git a/internal/backport/go/doc/comment/markdown.go b/internal/backport/go/doc/comment/markdown.go deleted file mode 100644 index 26937a4cdb..0000000000 --- a/internal/backport/go/doc/comment/markdown.go +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "bytes" - "fmt" - "strings" -) - -// An mdPrinter holds the state needed for printing a Doc as Markdown. -type mdPrinter struct { - *Printer - headingPrefix string - raw bytes.Buffer -} - -// Markdown returns a Markdown formatting of the Doc. -// See the [Printer] documentation for ways to customize the Markdown output. -func (p *Printer) Markdown(d *Doc) []byte { - mp := &mdPrinter{ - Printer: p, - headingPrefix: strings.Repeat("#", p.headingLevel()) + " ", - } - - var out bytes.Buffer - for i, x := range d.Content { - if i > 0 { - out.WriteByte('\n') - } - mp.block(&out, x) - } - return out.Bytes() -} - -// block prints the block x to out. -func (p *mdPrinter) block(out *bytes.Buffer, x Block) { - switch x := x.(type) { - default: - fmt.Fprintf(out, "?%T", x) - - case *Paragraph: - p.text(out, x.Text) - out.WriteString("\n") - - case *Heading: - out.WriteString(p.headingPrefix) - p.text(out, x.Text) - if id := p.headingID(x); id != "" { - out.WriteString(" {#") - out.WriteString(id) - out.WriteString("}") - } - out.WriteString("\n") - - case *Code: - md := x.Text - for md != "" { - var line string - line, md, _ = stringsCut(md, "\n") - if line != "" { - out.WriteString("\t") - out.WriteString(line) - } - out.WriteString("\n") - } - - case *List: - loose := x.BlankBetween() - for i, item := range x.Items { - if i > 0 && loose { - out.WriteString("\n") - } - if n := item.Number; n != "" { - out.WriteString(" ") - out.WriteString(n) - out.WriteString(". ") - } else { - out.WriteString(" - ") // SP SP - SP - } - for i, blk := range item.Content { - const fourSpace = " " - if i > 0 { - out.WriteString("\n" + fourSpace) - } - p.text(out, blk.(*Paragraph).Text) - out.WriteString("\n") - } - } - } -} - -// text prints the text sequence x to out. -func (p *mdPrinter) text(out *bytes.Buffer, x []Text) { - p.raw.Reset() - p.rawText(&p.raw, x) - line := bytes.TrimSpace(p.raw.Bytes()) - if len(line) == 0 { - return - } - switch line[0] { - case '+', '-', '*', '#': - // Escape what would be the start of an unordered list or heading. - out.WriteByte('\\') - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - i := 1 - for i < len(line) && '0' <= line[i] && line[i] <= '9' { - i++ - } - if i < len(line) && (line[i] == '.' || line[i] == ')') { - // Escape what would be the start of an ordered list. - out.Write(line[:i]) - out.WriteByte('\\') - line = line[i:] - } - } - out.Write(line) -} - -// rawText prints the text sequence x to out, -// without worrying about escaping characters -// that have special meaning at the start of a Markdown line. -func (p *mdPrinter) rawText(out *bytes.Buffer, x []Text) { - for _, t := range x { - switch t := t.(type) { - case Plain: - p.escape(out, string(t)) - case Italic: - out.WriteString("*") - p.escape(out, string(t)) - out.WriteString("*") - case *Link: - out.WriteString("[") - p.rawText(out, t.Text) - out.WriteString("](") - out.WriteString(t.URL) - out.WriteString(")") - case *DocLink: - url := p.docLinkURL(t) - if url != "" { - out.WriteString("[") - } - p.rawText(out, t.Text) - if url != "" { - out.WriteString("](") - url = strings.ReplaceAll(url, "(", "%28") - url = strings.ReplaceAll(url, ")", "%29") - out.WriteString(url) - out.WriteString(")") - } - } - } -} - -// escape prints s to out as plain text, -// escaping special characters to avoid being misinterpreted -// as Markdown markup sequences. -func (p *mdPrinter) escape(out *bytes.Buffer, s string) { - start := 0 - for i := 0; i < len(s); i++ { - switch s[i] { - case '\n': - // Turn all \n into spaces, for a few reasons: - // - Avoid introducing paragraph breaks accidentally. - // - Avoid the need to reindent after the newline. - // - Avoid problems with Markdown renderers treating - // every mid-paragraph newline as a
. - out.WriteString(s[start:i]) - out.WriteByte(' ') - start = i + 1 - continue - case '`', '_', '*', '[', '<', '\\': - // Not all of these need to be escaped all the time, - // but is valid and easy to do so. - // We assume the Markdown is being passed to a - // Markdown renderer, not edited by a person, - // so it's fine to have escapes that are not strictly - // necessary in some cases. - out.WriteString(s[start:i]) - out.WriteByte('\\') - out.WriteByte(s[i]) - start = i + 1 - } - } - out.WriteString(s[start:]) -} diff --git a/internal/backport/go/doc/comment/mkstd.sh b/internal/backport/go/doc/comment/mkstd.sh deleted file mode 100755 index c9dee8c55e..0000000000 --- a/internal/backport/go/doc/comment/mkstd.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# Copyright 2022 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -# This could be a good use for embed but go/doc/comment -# is built into the bootstrap go command, so it can't use embed. -# Also not using embed lets us emit a string array directly -# and avoid init-time work. - -( -echo "// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by 'go generate' DO NOT EDIT. -//go:generate ./mkstd.sh - -package comment - -var stdPkgs = []string{" -go list std | grep -v / | sort | sed 's/.*/"&",/' -echo "}" -) | gofmt >std.go.tmp && mv std.go.tmp std.go diff --git a/internal/backport/go/doc/comment/old_test.go b/internal/backport/go/doc/comment/old_test.go deleted file mode 100644 index 944f94d16d..0000000000 --- a/internal/backport/go/doc/comment/old_test.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// These tests are carried forward from the old go/doc implementation. - -package comment - -import "testing" - -var oldHeadingTests = []struct { - line string - ok bool -}{ - {"Section", true}, - {"A typical usage", true}, - {"ΔΛΞ is Greek", true}, - {"Foo 42", true}, - {"", false}, - {"section", false}, - {"A typical usage:", false}, - {"This code:", false}, - {"δ is Greek", false}, - {"Foo §", false}, - {"Fermat's Last Sentence", true}, - {"Fermat's", true}, - {"'sX", false}, - {"Ted 'Too' Bar", false}, - {"Use n+m", false}, - {"Scanning:", false}, - {"N:M", false}, -} - -func TestIsOldHeading(t *testing.T) { - for _, tt := range oldHeadingTests { - if isOldHeading(tt.line, []string{"Text.", "", tt.line, "", "Text."}, 2) != tt.ok { - t.Errorf("isOldHeading(%q) = %v, want %v", tt.line, !tt.ok, tt.ok) - } - } -} - -var autoURLTests = []struct { - in, out string -}{ - {"", ""}, - {"http://[::1]:8080/foo.txt", "http://[::1]:8080/foo.txt"}, - {"https://www.google.com) after", "https://www.google.com"}, - {"https://www.google.com:30/x/y/z:b::c. After", "https://www.google.com:30/x/y/z:b::c"}, - {"http://www.google.com/path/:;!-/?query=%34b#093124", "http://www.google.com/path/:;!-/?query=%34b#093124"}, - {"http://www.google.com/path/:;!-/?query=%34bar#093124", "http://www.google.com/path/:;!-/?query=%34bar#093124"}, - {"http://www.google.com/index.html! After", "http://www.google.com/index.html"}, - {"http://www.google.com/", "http://www.google.com/"}, - {"https://www.google.com/", "https://www.google.com/"}, - {"http://www.google.com/path.", "http://www.google.com/path"}, - {"http://en.wikipedia.org/wiki/Camellia_(cipher)", "http://en.wikipedia.org/wiki/Camellia_(cipher)"}, - {"http://www.google.com/)", "http://www.google.com/"}, - {"http://gmail.com)", "http://gmail.com"}, - {"http://gmail.com))", "http://gmail.com"}, - {"http://gmail.com ((http://gmail.com)) ()", "http://gmail.com"}, - {"http://example.com/ quux!", "http://example.com/"}, - {"http://example.com/%2f/ /world.", "http://example.com/%2f/"}, - {"http: ipsum //host/path", ""}, - {"javascript://is/not/linked", ""}, - {"http://foo", "http://foo"}, - {"https://www.example.com/person/][Person Name]]", "https://www.example.com/person/"}, - {"http://golang.org/)", "http://golang.org/"}, - {"http://golang.org/hello())", "http://golang.org/hello()"}, - {"http://git.qemu.org/?p=qemu.git;a=blob;f=qapi-schema.json;hb=HEAD", "http://git.qemu.org/?p=qemu.git;a=blob;f=qapi-schema.json;hb=HEAD"}, - {"https://foo.bar/bal/x(])", "https://foo.bar/bal/x"}, // inner ] causes (]) to be cut off from URL - {"http://bar(])", "http://bar"}, // same -} - -func TestAutoURL(t *testing.T) { - for _, tt := range autoURLTests { - url, ok := autoURL(tt.in) - if url != tt.out || ok != (tt.out != "") { - t.Errorf("autoURL(%q) = %q, %v, want %q, %v", tt.in, url, ok, tt.out, tt.out != "") - } - } -} diff --git a/internal/backport/go/doc/comment/parse.go b/internal/backport/go/doc/comment/parse.go deleted file mode 100644 index 5448ab3100..0000000000 --- a/internal/backport/go/doc/comment/parse.go +++ /dev/null @@ -1,1271 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "sort" - "strings" - "unicode" - "unicode/utf8" -) - -// A Doc is a parsed Go doc comment. -type Doc struct { - // Content is the sequence of content blocks in the comment. - Content []Block - - // Links is the link definitions in the comment. - Links []*LinkDef -} - -// A LinkDef is a single link definition. -type LinkDef struct { - Text string // the link text - URL string // the link URL - Used bool // whether the comment uses the definition -} - -// A Block is block-level content in a doc comment, -// one of [*Code], [*Heading], [*List], or [*Paragraph]. -type Block interface { - block() -} - -// A Heading is a doc comment heading. -type Heading struct { - Text []Text // the heading text -} - -func (*Heading) block() {} - -// A List is a numbered or bullet list. -// Lists are always non-empty: len(Items) > 0. -// In a numbered list, every Items[i].Number is a non-empty string. -// In a bullet list, every Items[i].Number is an empty string. -type List struct { - // Items is the list items. - Items []*ListItem - - // ForceBlankBefore indicates that the list must be - // preceded by a blank line when reformatting the comment, - // overriding the usual conditions. See the BlankBefore method. - // - // The comment parser sets ForceBlankBefore for any list - // that is preceded by a blank line, to make sure - // the blank line is preserved when printing. - ForceBlankBefore bool - - // ForceBlankBetween indicates that list items must be - // separated by blank lines when reformatting the comment, - // overriding the usual conditions. See the BlankBetween method. - // - // The comment parser sets ForceBlankBetween for any list - // that has a blank line between any two of its items, to make sure - // the blank lines are preserved when printing. - ForceBlankBetween bool -} - -func (*List) block() {} - -// BlankBefore reports whether a reformatting of the comment -// should include a blank line before the list. -// The default rule is the same as for [BlankBetween]: -// if the list item content contains any blank lines -// (meaning at least one item has multiple paragraphs) -// then the list itself must be preceded by a blank line. -// A preceding blank line can be forced by setting [List].ForceBlankBefore. -func (l *List) BlankBefore() bool { - return l.ForceBlankBefore || l.BlankBetween() -} - -// BlankBetween reports whether a reformatting of the comment -// should include a blank line between each pair of list items. -// The default rule is that if the list item content contains any blank lines -// (meaning at least one item has multiple paragraphs) -// then list items must themselves be separated by blank lines. -// Blank line separators can be forced by setting [List].ForceBlankBetween. -func (l *List) BlankBetween() bool { - if l.ForceBlankBetween { - return true - } - for _, item := range l.Items { - if len(item.Content) != 1 { - // Unreachable for parsed comments today, - // since the only way to get multiple item.Content - // is multiple paragraphs, which must have been - // separated by a blank line. - return true - } - } - return false -} - -// A ListItem is a single item in a numbered or bullet list. -type ListItem struct { - // Number is a decimal string in a numbered list - // or an empty string in a bullet list. - Number string // "1", "2", ...; "" for bullet list - - // Content is the list content. - // Currently, restrictions in the parser and printer - // require every element of Content to be a *Paragraph. - Content []Block // Content of this item. -} - -// A Paragraph is a paragraph of text. -type Paragraph struct { - Text []Text -} - -func (*Paragraph) block() {} - -// A Code is a preformatted code block. -type Code struct { - // Text is the preformatted text, ending with a newline character. - // It may be multiple lines, each of which ends with a newline character. - // It is never empty, nor does it start or end with a blank line. - Text string -} - -func (*Code) block() {} - -// A Text is text-level content in a doc comment, -// one of [Plain], [Italic], [*Link], or [*DocLink]. -type Text interface { - text() -} - -// A Plain is a string rendered as plain text (not italicized). -type Plain string - -func (Plain) text() {} - -// An Italic is a string rendered as italicized text. -type Italic string - -func (Italic) text() {} - -// A Link is a link to a specific URL. -type Link struct { - Auto bool // is this an automatic (implicit) link of a literal URL? - Text []Text // text of link - URL string // target URL of link -} - -func (*Link) text() {} - -// A DocLink is a link to documentation for a Go package or symbol. -type DocLink struct { - Text []Text // text of link - - // ImportPath, Recv, and Name identify the Go package or symbol - // that is the link target. The potential combinations of - // non-empty fields are: - // - ImportPath: a link to another package - // - ImportPath, Name: a link to a const, func, type, or var in another package - // - ImportPath, Recv, Name: a link to a method in another package - // - Name: a link to a const, func, type, or var in this package - // - Recv, Name: a link to a method in this package - ImportPath string // import path - Recv string // receiver type, without any pointer star, for methods - Name string // const, func, type, var, or method name -} - -func (*DocLink) text() {} - -// A Parser is a doc comment parser. -// The fields in the struct can be filled in before calling Parse -// in order to customize the details of the parsing process. -type Parser struct { - // Words is a map of Go identifier words that - // should be italicized and potentially linked. - // If Words[w] is the empty string, then the word w - // is only italicized. Otherwise it is linked, using - // Words[w] as the link target. - // Words corresponds to the [go/doc.ToHTML] words parameter. - Words map[string]string - - // LookupPackage resolves a package name to an import path. - // - // If LookupPackage(name) returns ok == true, then [name] - // (or [name.Sym] or [name.Sym.Method]) - // is considered a documentation link to importPath's package docs. - // It is valid to return "", true, in which case name is considered - // to refer to the current package. - // - // If LookupPackage(name) returns ok == false, - // then [name] (or [name.Sym] or [name.Sym.Method]) - // will not be considered a documentation link, - // except in the case where name is the full (but single-element) import path - // of a package in the standard library, such as in [math] or [io.Reader]. - // LookupPackage is still called for such names, - // in order to permit references to imports of other packages - // with the same package names. - // - // Setting LookupPackage to nil is equivalent to setting it to - // a function that always returns "", false. - LookupPackage func(name string) (importPath string, ok bool) - - // LookupSym reports whether a symbol name or method name - // exists in the current package. - // - // If LookupSym("", "Name") returns true, then [Name] - // is considered a documentation link for a const, func, type, or var. - // - // Similarly, if LookupSym("Recv", "Name") returns true, - // then [Recv.Name] is considered a documentation link for - // type Recv's method Name. - // - // Setting LookupSym to nil is equivalent to setting it to a function - // that always returns false. - LookupSym func(recv, name string) (ok bool) -} - -// parseDoc is parsing state for a single doc comment. -type parseDoc struct { - *Parser - *Doc - links map[string]*LinkDef - lines []string - lookupSym func(recv, name string) bool -} - -// lookupPkg is called to look up the pkg in [pkg], [pkg.Name], and [pkg.Name.Recv]. -// If pkg has a slash, it is assumed to be the full import path and is returned with ok = true. -// -// Otherwise, pkg is probably a simple package name like "rand" (not "crypto/rand" or "math/rand"). -// d.LookupPackage provides a way for the caller to allow resolving such names with reference -// to the imports in the surrounding package. -// -// There is one collision between these two cases: single-element standard library names -// like "math" are full import paths but don't contain slashes. We let d.LookupPackage have -// the first chance to resolve it, in case there's a different package imported as math, -// and otherwise we refer to a built-in list of single-element standard library package names. -func (d *parseDoc) lookupPkg(pkg string) (importPath string, ok bool) { - if strings.Contains(pkg, "/") { // assume a full import path - if validImportPath(pkg) { - return pkg, true - } - return "", false - } - if d.LookupPackage != nil { - // Give LookupPackage a chance. - if path, ok := d.LookupPackage(pkg); ok { - return path, true - } - } - return DefaultLookupPackage(pkg) -} - -func isStdPkg(path string) bool { - // TODO(rsc): Use sort.Find once we don't have to worry about - // copying this code into older Go environments. - i := sort.Search(len(stdPkgs), func(i int) bool { return stdPkgs[i] >= path }) - return i < len(stdPkgs) && stdPkgs[i] == path -} - -// DefaultLookupPackage is the default package lookup -// function, used when [Parser].LookupPackage is nil. -// It recognizes names of the packages from the standard -// library with single-element import paths, such as math, -// which would otherwise be impossible to name. -// -// Note that the go/doc package provides a more sophisticated -// lookup based on the imports used in the current package. -func DefaultLookupPackage(name string) (importPath string, ok bool) { - if isStdPkg(name) { - return name, true - } - return "", false -} - -// Parse parses the doc comment text and returns the *Doc form. -// Comment markers (/* // and */) in the text must have already been removed. -func (p *Parser) Parse(text string) *Doc { - lines := unindent(strings.Split(text, "\n")) - d := &parseDoc{ - Parser: p, - Doc: new(Doc), - links: make(map[string]*LinkDef), - lines: lines, - lookupSym: func(recv, name string) bool { return false }, - } - if p.LookupSym != nil { - d.lookupSym = p.LookupSym - } - - // First pass: break into block structure and collect known links. - // The text is all recorded as Plain for now. - var prev span - for _, s := range parseSpans(lines) { - var b Block - switch s.kind { - default: - panic("go/doc/comment: internal error: unknown span kind") - case spanList: - b = d.list(lines[s.start:s.end], prev.end < s.start) - case spanCode: - b = d.code(lines[s.start:s.end]) - case spanOldHeading: - b = d.oldHeading(lines[s.start]) - case spanHeading: - b = d.heading(lines[s.start]) - case spanPara: - b = d.paragraph(lines[s.start:s.end]) - } - if b != nil { - d.Content = append(d.Content, b) - } - prev = s - } - - // Second pass: interpret all the Plain text now that we know the links. - for _, b := range d.Content { - switch b := b.(type) { - case *Paragraph: - b.Text = d.parseLinkedText(string(b.Text[0].(Plain))) - case *List: - for _, i := range b.Items { - for _, c := range i.Content { - p := c.(*Paragraph) - p.Text = d.parseLinkedText(string(p.Text[0].(Plain))) - } - } - } - } - - return d.Doc -} - -// A span represents a single span of comment lines (lines[start:end]) -// of an identified kind (code, heading, paragraph, and so on). -type span struct { - start int - end int - kind spanKind -} - -// A spanKind describes the kind of span. -type spanKind int - -const ( - _ spanKind = iota - spanCode - spanHeading - spanList - spanOldHeading - spanPara -) - -func parseSpans(lines []string) []span { - var spans []span - - // The loop may process a line twice: once as unindented - // and again forced indented. So the maximum expected - // number of iterations is 2*len(lines). The repeating logic - // can be subtle, though, and to protect against introduction - // of infinite loops in future changes, we watch to see that - // we are not looping too much. A panic is better than a - // quiet infinite loop. - watchdog := 2 * len(lines) - - i := 0 - forceIndent := 0 -Spans: - for { - // Skip blank lines. - for i < len(lines) && lines[i] == "" { - i++ - } - if i >= len(lines) { - break - } - if watchdog--; watchdog < 0 { - panic("go/doc/comment: internal error: not making progress") - } - - var kind spanKind - start := i - end := i - if i < forceIndent || indented(lines[i]) { - // Indented (or force indented). - // Ends before next unindented. (Blank lines are OK.) - // If this is an unindented list that we are heuristically treating as indented, - // then accept unindented list item lines up to the first blank lines. - // The heuristic is disabled at blank lines to contain its effect - // to non-gofmt'ed sections of the comment. - unindentedListOK := isList(lines[i]) && i < forceIndent - i++ - for i < len(lines) && (lines[i] == "" || i < forceIndent || indented(lines[i]) || (unindentedListOK && isList(lines[i]))) { - if lines[i] == "" { - unindentedListOK = false - } - i++ - } - - // Drop trailing blank lines. - end = i - for end > start && lines[end-1] == "" { - end-- - } - - // If indented lines are followed (without a blank line) - // by an unindented line ending in a brace, - // take that one line too. This fixes the common mistake - // of pasting in something like - // - // func main() { - // fmt.Println("hello, world") - // } - // - // and forgetting to indent it. - // The heuristic will never trigger on a gofmt'ed comment, - // because any gofmt'ed code block or list would be - // followed by a blank line or end of comment. - if end < len(lines) && strings.HasPrefix(lines[end], "}") { - end++ - } - - if isList(lines[start]) { - kind = spanList - } else { - kind = spanCode - } - } else { - // Unindented. Ends at next blank or indented line. - i++ - for i < len(lines) && lines[i] != "" && !indented(lines[i]) { - i++ - } - end = i - - // If unindented lines are followed (without a blank line) - // by an indented line that would start a code block, - // check whether the final unindented lines - // should be left for the indented section. - // This can happen for the common mistakes of - // unindented code or unindented lists. - // The heuristic will never trigger on a gofmt'ed comment, - // because any gofmt'ed code block would have a blank line - // preceding it after the unindented lines. - if i < len(lines) && lines[i] != "" && !isList(lines[i]) { - switch { - case isList(lines[i-1]): - // If the final unindented line looks like a list item, - // this may be the first indented line wrap of - // a mistakenly unindented list. - // Leave all the unindented list items. - forceIndent = end - end-- - for end > start && isList(lines[end-1]) { - end-- - } - - case strings.HasSuffix(lines[i-1], "{") || strings.HasSuffix(lines[i-1], `\`): - // If the final unindented line ended in { or \ - // it is probably the start of a misindented code block. - // Give the user a single line fix. - // Often that's enough; if not, the user can fix the others themselves. - forceIndent = end - end-- - } - - if start == end && forceIndent > start { - i = start - continue Spans - } - } - - // Span is either paragraph or heading. - if end-start == 1 && isHeading(lines[start]) { - kind = spanHeading - } else if end-start == 1 && isOldHeading(lines[start], lines, start) { - kind = spanOldHeading - } else { - kind = spanPara - } - } - - spans = append(spans, span{start, end, kind}) - i = end - } - - return spans -} - -// indented reports whether line is indented -// (starts with a leading space or tab). -func indented(line string) bool { - return line != "" && (line[0] == ' ' || line[0] == '\t') -} - -// unindent removes any common space/tab prefix -// from each line in lines, returning a copy of lines in which -// those prefixes have been trimmed from each line. -// It also replaces any lines containing only spaces with blank lines (empty strings). -func unindent(lines []string) []string { - // Trim leading and trailing blank lines. - for len(lines) > 0 && isBlank(lines[0]) { - lines = lines[1:] - } - for len(lines) > 0 && isBlank(lines[len(lines)-1]) { - lines = lines[:len(lines)-1] - } - if len(lines) == 0 { - return nil - } - - // Compute and remove common indentation. - prefix := leadingSpace(lines[0]) - for _, line := range lines[1:] { - if !isBlank(line) { - prefix = commonPrefix(prefix, leadingSpace(line)) - } - } - - out := make([]string, len(lines)) - for i, line := range lines { - line = strings.TrimPrefix(line, prefix) - if strings.TrimSpace(line) == "" { - line = "" - } - out[i] = line - } - for len(out) > 0 && out[0] == "" { - out = out[1:] - } - for len(out) > 0 && out[len(out)-1] == "" { - out = out[:len(out)-1] - } - return out -} - -// isBlank reports whether s is a blank line. -func isBlank(s string) bool { - return len(s) == 0 || (len(s) == 1 && s[0] == '\n') -} - -// commonPrefix returns the longest common prefix of a and b. -func commonPrefix(a, b string) string { - i := 0 - for i < len(a) && i < len(b) && a[i] == b[i] { - i++ - } - return a[0:i] -} - -// leadingSpace returns the longest prefix of s consisting of spaces and tabs. -func leadingSpace(s string) string { - i := 0 - for i < len(s) && (s[i] == ' ' || s[i] == '\t') { - i++ - } - return s[:i] -} - -// isOldHeading reports whether line is an old-style section heading. -// line is all[off]. -func isOldHeading(line string, all []string, off int) bool { - if off <= 0 || all[off-1] != "" || off+2 >= len(all) || all[off+1] != "" || leadingSpace(all[off+2]) != "" { - return false - } - - line = strings.TrimSpace(line) - - // a heading must start with an uppercase letter - r, _ := utf8.DecodeRuneInString(line) - if !unicode.IsLetter(r) || !unicode.IsUpper(r) { - return false - } - - // it must end in a letter or digit: - r, _ = utf8.DecodeLastRuneInString(line) - if !unicode.IsLetter(r) && !unicode.IsDigit(r) { - return false - } - - // exclude lines with illegal characters. we allow "()," - if strings.ContainsAny(line, ";:!?+*/=[]{}_^°&§~%#@<\">\\") { - return false - } - - // allow "'" for possessive "'s" only - for b := line; ; { - var ok bool - if _, b, ok = stringsCut(b, "'"); !ok { - break - } - if b != "s" && !strings.HasPrefix(b, "s ") { - return false // ' not followed by s and then end-of-word - } - } - - // allow "." when followed by non-space - for b := line; ; { - var ok bool - if _, b, ok = stringsCut(b, "."); !ok { - break - } - if b == "" || strings.HasPrefix(b, " ") { - return false // not followed by non-space - } - } - - return true -} - -// oldHeading returns the *Heading for the given old-style section heading line. -func (d *parseDoc) oldHeading(line string) Block { - return &Heading{Text: []Text{Plain(strings.TrimSpace(line))}} -} - -// isHeading reports whether line is a new-style section heading. -func isHeading(line string) bool { - return len(line) >= 2 && - line[0] == '#' && - (line[1] == ' ' || line[1] == '\t') && - strings.TrimSpace(line) != "#" -} - -// heading returns the *Heading for the given new-style section heading line. -func (d *parseDoc) heading(line string) Block { - return &Heading{Text: []Text{Plain(strings.TrimSpace(line[1:]))}} -} - -// code returns a code block built from the lines. -func (d *parseDoc) code(lines []string) *Code { - body := unindent(lines) - body = append(body, "") // to get final \n from Join - return &Code{Text: strings.Join(body, "\n")} -} - -// paragraph returns a paragraph block built from the lines. -// If the lines are link definitions, paragraph adds them to d and returns nil. -func (d *parseDoc) paragraph(lines []string) Block { - // Is this a block of known links? Handle. - var defs []*LinkDef - for _, line := range lines { - def, ok := parseLink(line) - if !ok { - goto NoDefs - } - defs = append(defs, def) - } - for _, def := range defs { - d.Links = append(d.Links, def) - if d.links[def.Text] == nil { - d.links[def.Text] = def - } - } - return nil -NoDefs: - - return &Paragraph{Text: []Text{Plain(strings.Join(lines, "\n"))}} -} - -// parseLink parses a single link definition line: -// -// [text]: url -// -// It returns the link definition and whether the line was well formed. -func parseLink(line string) (*LinkDef, bool) { - if line == "" || line[0] != '[' { - return nil, false - } - i := strings.Index(line, "]:") - if i < 0 || i+3 >= len(line) || (line[i+2] != ' ' && line[i+2] != '\t') { - return nil, false - } - - text := line[1:i] - url := strings.TrimSpace(line[i+3:]) - j := strings.Index(url, "://") - if j < 0 || !isScheme(url[:j]) { - return nil, false - } - - // Line has right form and has valid scheme://. - // That's good enough for us - we are not as picky - // about the characters beyond the :// as we are - // when extracting inline URLs from text. - return &LinkDef{Text: text, URL: url}, true -} - -// list returns a list built from the indented lines, -// using forceBlankBefore as the value of the List's ForceBlankBefore field. -func (d *parseDoc) list(lines []string, forceBlankBefore bool) *List { - num, _, _ := listMarker(lines[0]) - var ( - list *List = &List{ForceBlankBefore: forceBlankBefore} - item *ListItem - text []string - ) - flush := func() { - if item != nil { - if para := d.paragraph(text); para != nil { - item.Content = append(item.Content, para) - } - } - text = nil - } - - for _, line := range lines { - if n, after, ok := listMarker(line); ok && (n != "") == (num != "") { - // start new list item - flush() - - item = &ListItem{Number: n} - list.Items = append(list.Items, item) - line = after - } - line = strings.TrimSpace(line) - if line == "" { - list.ForceBlankBetween = true - flush() - continue - } - text = append(text, strings.TrimSpace(line)) - } - flush() - return list -} - -// listMarker parses the line as beginning with a list marker. -// If it can do that, it returns the numeric marker ("" for a bullet list), -// the rest of the line, and ok == true. -// Otherwise, it returns "", "", false. -func listMarker(line string) (num, rest string, ok bool) { - line = strings.TrimSpace(line) - if line == "" { - return "", "", false - } - - // Can we find a marker? - if r, n := utf8.DecodeRuneInString(line); r == '•' || r == '*' || r == '+' || r == '-' { - num, rest = "", line[n:] - } else if '0' <= line[0] && line[0] <= '9' { - n := 1 - for n < len(line) && '0' <= line[n] && line[n] <= '9' { - n++ - } - if n >= len(line) || (line[n] != '.' && line[n] != ')') { - return "", "", false - } - num, rest = line[:n], line[n+1:] - } else { - return "", "", false - } - - if !indented(rest) || strings.TrimSpace(rest) == "" { - return "", "", false - } - - return num, rest, true -} - -// isList reports whether the line is the first line of a list, -// meaning starts with a list marker after any indentation. -// (The caller is responsible for checking the line is indented, as appropriate.) -func isList(line string) bool { - _, _, ok := listMarker(line) - return ok -} - -// parseLinkedText parses text that is allowed to contain explicit links, -// such as [math.Sin] or [Go home page], into a slice of Text items. -// -// A “pkg” is only assumed to be a full import path if it starts with -// a domain name (a path element with a dot) or is one of the packages -// from the standard library (“[os]”, “[encoding/json]”, and so on). -// To avoid problems with maps, generics, and array types, doc links -// must be both preceded and followed by punctuation, spaces, tabs, -// or the start or end of a line. An example problem would be treating -// map[ast.Expr]TypeAndValue as containing a link. -func (d *parseDoc) parseLinkedText(text string) []Text { - var out []Text - wrote := 0 - flush := func(i int) { - if wrote < i { - out = d.parseText(out, text[wrote:i], true) - wrote = i - } - } - - start := -1 - var buf []byte - for i := 0; i < len(text); i++ { - c := text[i] - if c == '\n' || c == '\t' { - c = ' ' - } - switch c { - case '[': - start = i - case ']': - if start >= 0 { - if def, ok := d.links[string(buf)]; ok { - def.Used = true - flush(start) - out = append(out, &Link{ - Text: d.parseText(nil, text[start+1:i], false), - URL: def.URL, - }) - wrote = i + 1 - } else if link, ok := d.docLink(text[start+1:i], text[:start], text[i+1:]); ok { - flush(start) - link.Text = d.parseText(nil, text[start+1:i], false) - out = append(out, link) - wrote = i + 1 - } - } - start = -1 - buf = buf[:0] - } - if start >= 0 && i != start { - buf = append(buf, c) - } - } - - flush(len(text)) - return out -} - -// docLink parses text, which was found inside [ ] brackets, -// as a doc link if possible, returning the DocLink and ok == true -// or else nil, false. -// The before and after strings are the text before the [ and after the ] -// on the same line. Doc links must be preceded and followed by -// punctuation, spaces, tabs, or the start or end of a line. -func (d *parseDoc) docLink(text, before, after string) (link *DocLink, ok bool) { - if before != "" { - r, _ := utf8.DecodeLastRuneInString(before) - if !unicode.IsPunct(r) && r != ' ' && r != '\t' && r != '\n' { - return nil, false - } - } - if after != "" { - r, _ := utf8.DecodeRuneInString(after) - if !unicode.IsPunct(r) && r != ' ' && r != '\t' && r != '\n' { - return nil, false - } - } - if strings.HasPrefix(text, "*") { - text = text[1:] - } - pkg, name, ok := splitDocName(text) - var recv string - if ok { - pkg, recv, _ = splitDocName(pkg) - } - if pkg != "" { - if pkg, ok = d.lookupPkg(pkg); !ok { - return nil, false - } - } else { - if ok = d.lookupSym(recv, name); !ok { - return nil, false - } - } - link = &DocLink{ - ImportPath: pkg, - Recv: recv, - Name: name, - } - return link, true -} - -// If text is of the form before.Name, where Name is a capitalized Go identifier, -// then splitDocName returns before, name, true. -// Otherwise it returns text, "", false. -func splitDocName(text string) (before, name string, foundDot bool) { - i := strings.LastIndex(text, ".") - name = text[i+1:] - if !isName(name) { - return text, "", false - } - if i >= 0 { - before = text[:i] - } - return before, name, true -} - -// parseText parses s as text and returns the result of appending -// those parsed Text elements to out. -// parseText does not handle explicit links like [math.Sin] or [Go home page]: -// those are handled by parseLinkedText. -// If autoLink is true, then parseText recognizes URLs and words from d.Words -// and converts those to links as appropriate. -func (d *parseDoc) parseText(out []Text, s string, autoLink bool) []Text { - var w strings.Builder - wrote := 0 - writeUntil := func(i int) { - w.WriteString(s[wrote:i]) - wrote = i - } - flush := func(i int) { - writeUntil(i) - if w.Len() > 0 { - out = append(out, Plain(w.String())) - w.Reset() - } - } - for i := 0; i < len(s); { - t := s[i:] - if autoLink { - if url, ok := autoURL(t); ok { - flush(i) - // Note: The old comment parser would look up the URL in words - // and replace the target with words[URL] if it was non-empty. - // That would allow creating links that display as one URL but - // when clicked go to a different URL. Not sure what the point - // of that is, so we're not doing that lookup here. - out = append(out, &Link{Auto: true, Text: []Text{Plain(url)}, URL: url}) - i += len(url) - wrote = i - continue - } - if id, ok := ident(t); ok { - url, italics := d.Words[id] - if !italics { - i += len(id) - continue - } - flush(i) - if url == "" { - out = append(out, Italic(id)) - } else { - out = append(out, &Link{Auto: true, Text: []Text{Italic(id)}, URL: url}) - } - i += len(id) - wrote = i - continue - } - } - switch { - case strings.HasPrefix(t, "``"): - if len(t) >= 3 && t[2] == '`' { - // Do not convert `` inside ```, in case people are mistakenly writing Markdown. - i += 3 - for i < len(t) && t[i] == '`' { - i++ - } - break - } - writeUntil(i) - w.WriteRune('“') - i += 2 - wrote = i - case strings.HasPrefix(t, "''"): - writeUntil(i) - w.WriteRune('”') - i += 2 - wrote = i - default: - i++ - } - } - flush(len(s)) - return out -} - -// autoURL checks whether s begins with a URL that should be hyperlinked. -// If so, it returns the URL, which is a prefix of s, and ok == true. -// Otherwise it returns "", false. -// The caller should skip over the first len(url) bytes of s -// before further processing. -func autoURL(s string) (url string, ok bool) { - // Find the ://. Fast path to pick off non-URL, - // since we call this at every position in the string. - // The shortest possible URL is ftp://x, 7 bytes. - var i int - switch { - case len(s) < 7: - return "", false - case s[3] == ':': - i = 3 - case s[4] == ':': - i = 4 - case s[5] == ':': - i = 5 - case s[6] == ':': - i = 6 - default: - return "", false - } - if i+3 > len(s) || s[i:i+3] != "://" { - return "", false - } - - // Check valid scheme. - if !isScheme(s[:i]) { - return "", false - } - - // Scan host part. Must have at least one byte, - // and must start and end in non-punctuation. - i += 3 - if i >= len(s) || !isHost(s[i]) || isPunct(s[i]) { - return "", false - } - i++ - end := i - for i < len(s) && isHost(s[i]) { - if !isPunct(s[i]) { - end = i + 1 - } - i++ - } - i = end - - // At this point we are definitely returning a URL (scheme://host). - // We just have to find the longest path we can add to it. - // Heuristics abound. - // We allow parens, braces, and brackets, - // but only if they match (#5043, #22285). - // We allow .,:;?! in the path but not at the end, - // to avoid end-of-sentence punctuation (#18139, #16565). - stk := []byte{} - end = i -Path: - for ; i < len(s); i++ { - if isPunct(s[i]) { - continue - } - if !isPath(s[i]) { - break - } - switch s[i] { - case '(': - stk = append(stk, ')') - case '{': - stk = append(stk, '}') - case '[': - stk = append(stk, ']') - case ')', '}', ']': - if len(stk) == 0 || stk[len(stk)-1] != s[i] { - break Path - } - stk = stk[:len(stk)-1] - } - if len(stk) == 0 { - end = i + 1 - } - } - - return s[:end], true -} - -// isScheme reports whether s is a recognized URL scheme. -// Note that if strings of new length (beyond 3-7) -// are added here, the fast path at the top of autoURL will need updating. -func isScheme(s string) bool { - switch s { - case "file", - "ftp", - "gopher", - "http", - "https", - "mailto", - "nntp": - return true - } - return false -} - -// isHost reports whether c is a byte that can appear in a URL host, -// like www.example.com or user@[::1]:8080 -func isHost(c byte) bool { - // mask is a 128-bit bitmap with 1s for allowed bytes, - // so that the byte c can be tested with a shift and an and. - // If c > 128, then 1<>64)) != 0 -} - -// isPunct reports whether c is a punctuation byte that can appear -// inside a path but not at the end. -func isPunct(c byte) bool { - // mask is a 128-bit bitmap with 1s for allowed bytes, - // so that the byte c can be tested with a shift and an and. - // If c > 128, then 1<>64)) != 0 -} - -// isPath reports whether c is a (non-punctuation) path byte. -func isPath(c byte) bool { - // mask is a 128-bit bitmap with 1s for allowed bytes, - // so that the byte c can be tested with a shift and an and. - // If c > 128, then 1<>64)) != 0 -} - -// isName reports whether s is a capitalized Go identifier (like Name). -func isName(s string) bool { - t, ok := ident(s) - if !ok || t != s { - return false - } - r, _ := utf8.DecodeRuneInString(s) - return unicode.IsUpper(r) -} - -// ident checks whether s begins with a Go identifier. -// If so, it returns the identifier, which is a prefix of s, and ok == true. -// Otherwise it returns "", false. -// The caller should skip over the first len(id) bytes of s -// before further processing. -func ident(s string) (id string, ok bool) { - // Scan [\pL_][\pL_0-9]* - n := 0 - for n < len(s) { - if c := s[n]; c < utf8.RuneSelf { - if isIdentASCII(c) && (n > 0 || c < '0' || c > '9') { - n++ - continue - } - break - } - r, nr := utf8.DecodeRuneInString(s[n:]) - if unicode.IsLetter(r) { - n += nr - continue - } - break - } - return s[:n], n > 0 -} - -// isIdentASCII reports whether c is an ASCII identifier byte. -func isIdentASCII(c byte) bool { - // mask is a 128-bit bitmap with 1s for allowed bytes, - // so that the byte c can be tested with a shift and an and. - // If c > 128, then 1<>64)) != 0 -} - -// validImportPath reports whether path is a valid import path. -// It is a lightly edited copy of golang.org/x/mod/module.CheckImportPath. -func validImportPath(path string) bool { - if !utf8.ValidString(path) { - return false - } - if path == "" { - return false - } - if path[0] == '-' { - return false - } - if strings.Contains(path, "//") { - return false - } - if path[len(path)-1] == '/' { - return false - } - elemStart := 0 - for i, r := range path { - if r == '/' { - if !validImportPathElem(path[elemStart:i]) { - return false - } - elemStart = i + 1 - } - } - return validImportPathElem(path[elemStart:]) -} - -func validImportPathElem(elem string) bool { - if elem == "" || elem[0] == '.' || elem[len(elem)-1] == '.' { - return false - } - for i := 0; i < len(elem); i++ { - if !importPathOK(elem[i]) { - return false - } - } - return true -} - -func importPathOK(c byte) bool { - // mask is a 128-bit bitmap with 1s for allowed bytes, - // so that the byte c can be tested with a shift and an and. - // If c > 128, then 1<>64)) != 0 -} - -func stringsCut(s, sep string) (before, after string, found bool) { - if i := strings.Index(s, sep); i >= 0 { - return s[:i], s[i+len(sep):], true - } - return s, "", false -} diff --git a/internal/backport/go/doc/comment/parse_test.go b/internal/backport/go/doc/comment/parse_test.go deleted file mode 100644 index bce733eaae..0000000000 --- a/internal/backport/go/doc/comment/parse_test.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import "testing" - -// See https://golang.org/issue/52353 -func Test52353(t *testing.T) { - ident("𫕐ﯯ") -} diff --git a/internal/backport/go/doc/comment/print.go b/internal/backport/go/doc/comment/print.go deleted file mode 100644 index 4a57b89ee3..0000000000 --- a/internal/backport/go/doc/comment/print.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "bytes" - "fmt" - "strings" -) - -// A Printer is a doc comment printer. -// The fields in the struct can be filled in before calling -// any of the printing methods -// in order to customize the details of the printing process. -type Printer struct { - // HeadingLevel is the nesting level used for - // HTML and Markdown headings. - // If HeadingLevel is zero, it defaults to level 3, - // meaning to use

and ###. - HeadingLevel int - - // HeadingID is a function that computes the heading ID - // (anchor tag) to use for the heading h when generating - // HTML and Markdown. If HeadingID returns an empty string, - // then the heading ID is omitted. - // If HeadingID is nil, h.DefaultID is used. - HeadingID func(h *Heading) string - - // DocLinkURL is a function that computes the URL for the given DocLink. - // If DocLinkURL is nil, then link.DefaultURL(p.DocLinkBaseURL) is used. - DocLinkURL func(link *DocLink) string - - // DocLinkBaseURL is used when DocLinkURL is nil, - // passed to [DocLink.DefaultURL] to construct a DocLink's URL. - // See that method's documentation for details. - DocLinkBaseURL string - - // TextPrefix is a prefix to print at the start of every line - // when generating text output using the Text method. - TextPrefix string - - // TextCodePrefix is the prefix to print at the start of each - // preformatted (code block) line when generating text output, - // instead of (not in addition to) TextPrefix. - // If TextCodePrefix is the empty string, it defaults to TextPrefix+"\t". - TextCodePrefix string - - // TextWidth is the maximum width text line to generate, - // measured in Unicode code points, - // excluding TextPrefix and the newline character. - // If TextWidth is zero, it defaults to 80 minus the number of code points in TextPrefix. - // If TextWidth is negative, there is no limit. - TextWidth int -} - -func (p *Printer) headingLevel() int { - if p.HeadingLevel <= 0 { - return 3 - } - return p.HeadingLevel -} - -func (p *Printer) headingID(h *Heading) string { - if p.HeadingID == nil { - return h.DefaultID() - } - return p.HeadingID(h) -} - -func (p *Printer) docLinkURL(link *DocLink) string { - if p.DocLinkURL != nil { - return p.DocLinkURL(link) - } - return link.DefaultURL(p.DocLinkBaseURL) -} - -// DefaultURL constructs and returns the documentation URL for l, -// using baseURL as a prefix for links to other packages. -// -// The possible forms returned by DefaultURL are: -// - baseURL/ImportPath, for a link to another package -// - baseURL/ImportPath#Name, for a link to a const, func, type, or var in another package -// - baseURL/ImportPath#Recv.Name, for a link to a method in another package -// - #Name, for a link to a const, func, type, or var in this package -// - #Recv.Name, for a link to a method in this package -// -// If baseURL ends in a trailing slash, then DefaultURL inserts -// a slash between ImportPath and # in the anchored forms. -// For example, here are some baseURL values and URLs they can generate: -// -// "/pkg/" → "/pkg/math/#Sqrt" -// "/pkg" → "/pkg/math#Sqrt" -// "/" → "/math/#Sqrt" -// "" → "/math#Sqrt" -func (l *DocLink) DefaultURL(baseURL string) string { - if l.ImportPath != "" { - slash := "" - if strings.HasSuffix(baseURL, "/") { - slash = "/" - } else { - baseURL += "/" - } - switch { - case l.Name == "": - return baseURL + l.ImportPath + slash - case l.Recv != "": - return baseURL + l.ImportPath + slash + "#" + l.Recv + "." + l.Name - default: - return baseURL + l.ImportPath + slash + "#" + l.Name - } - } - if l.Recv != "" { - return "#" + l.Recv + "." + l.Name - } - return "#" + l.Name -} - -// DefaultID returns the default anchor ID for the heading h. -// -// The default anchor ID is constructed by converting every -// rune that is not alphanumeric ASCII to an underscore -// and then adding the prefix “hdr-”. -// For example, if the heading text is “Go Doc Comments”, -// the default ID is “hdr-Go_Doc_Comments”. -func (h *Heading) DefaultID() string { - // Note: The “hdr-” prefix is important to avoid DOM clobbering attacks. - // See https://pkg.go.dev/github.com/google/safehtml#Identifier. - var out strings.Builder - var p textPrinter - p.oneLongLine(&out, h.Text) - s := strings.TrimSpace(out.String()) - if s == "" { - return "" - } - out.Reset() - out.WriteString("hdr-") - for _, r := range s { - if r < 0x80 && isIdentASCII(byte(r)) { - out.WriteByte(byte(r)) - } else { - out.WriteByte('_') - } - } - return out.String() -} - -type commentPrinter struct { - *Printer - headingPrefix string - needDoc map[string]bool -} - -// Comment returns the standard Go formatting of the Doc, -// without any comment markers. -func (p *Printer) Comment(d *Doc) []byte { - cp := &commentPrinter{Printer: p} - var out bytes.Buffer - for i, x := range d.Content { - if i > 0 && blankBefore(x) { - out.WriteString("\n") - } - cp.block(&out, x) - } - - // Print one block containing all the link definitions that were used, - // and then a second block containing all the unused ones. - // This makes it easy to clean up the unused ones: gofmt and - // delete the final block. And it's a nice visual signal without - // affecting the way the comment formats for users. - for i := 0; i < 2; i++ { - used := i == 0 - first := true - for _, def := range d.Links { - if def.Used == used { - if first { - out.WriteString("\n") - first = false - } - out.WriteString("[") - out.WriteString(def.Text) - out.WriteString("]: ") - out.WriteString(def.URL) - out.WriteString("\n") - } - } - } - - return out.Bytes() -} - -// blankBefore reports whether the block x requires a blank line before it. -// All blocks do, except for Lists that return false from x.BlankBefore(). -func blankBefore(x Block) bool { - if x, ok := x.(*List); ok { - return x.BlankBefore() - } - return true -} - -// block prints the block x to out. -func (p *commentPrinter) block(out *bytes.Buffer, x Block) { - switch x := x.(type) { - default: - fmt.Fprintf(out, "?%T", x) - - case *Paragraph: - p.text(out, "", x.Text) - out.WriteString("\n") - - case *Heading: - out.WriteString("# ") - p.text(out, "", x.Text) - out.WriteString("\n") - - case *Code: - md := x.Text - for md != "" { - var line string - line, md, _ = stringsCut(md, "\n") - if line != "" { - out.WriteString("\t") - out.WriteString(line) - } - out.WriteString("\n") - } - - case *List: - loose := x.BlankBetween() - for i, item := range x.Items { - if i > 0 && loose { - out.WriteString("\n") - } - out.WriteString(" ") - if item.Number == "" { - out.WriteString(" - ") - } else { - out.WriteString(item.Number) - out.WriteString(". ") - } - for i, blk := range item.Content { - const fourSpace = " " - if i > 0 { - out.WriteString("\n" + fourSpace) - } - p.text(out, fourSpace, blk.(*Paragraph).Text) - out.WriteString("\n") - } - } - } -} - -// text prints the text sequence x to out. -func (p *commentPrinter) text(out *bytes.Buffer, indent string, x []Text) { - for _, t := range x { - switch t := t.(type) { - case Plain: - p.indent(out, indent, string(t)) - case Italic: - p.indent(out, indent, string(t)) - case *Link: - if t.Auto { - p.text(out, indent, t.Text) - } else { - out.WriteString("[") - p.text(out, indent, t.Text) - out.WriteString("]") - } - case *DocLink: - out.WriteString("[") - p.text(out, indent, t.Text) - out.WriteString("]") - } - } -} - -// indent prints s to out, indenting with the indent string -// after each newline in s. -func (p *commentPrinter) indent(out *bytes.Buffer, indent, s string) { - for s != "" { - line, rest, ok := stringsCut(s, "\n") - out.WriteString(line) - if ok { - out.WriteString("\n") - out.WriteString(indent) - } - s = rest - } -} diff --git a/internal/backport/go/doc/comment/std.go b/internal/backport/go/doc/comment/std.go deleted file mode 100644 index 71f15f47b1..0000000000 --- a/internal/backport/go/doc/comment/std.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by 'go generate' DO NOT EDIT. -//go:generate ./mkstd.sh - -package comment - -var stdPkgs = []string{ - "bufio", - "bytes", - "context", - "crypto", - "embed", - "encoding", - "errors", - "expvar", - "flag", - "fmt", - "hash", - "html", - "image", - "io", - "log", - "math", - "mime", - "net", - "os", - "path", - "plugin", - "reflect", - "regexp", - "runtime", - "sort", - "strconv", - "strings", - "sync", - "syscall", - "testing", - "time", - "unicode", - "unsafe", -} diff --git a/internal/backport/go/doc/comment/std_test.go b/internal/backport/go/doc/comment/std_test.go deleted file mode 100644 index 7f3aba8f7e..0000000000 --- a/internal/backport/go/doc/comment/std_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "os/exec" - "sort" - "strings" - "testing" - - "golang.org/x/website/internal/backport/diff" -) - -func TestStd(t *testing.T) { - out, err := exec.Command("go", "list", "std").CombinedOutput() - if err != nil { - t.Fatalf("%v\n%s", err, out) - } - - var list []string - for _, pkg := range strings.Fields(string(out)) { - if !strings.Contains(pkg, "/") { - list = append(list, pkg) - } - } - sort.Strings(list) - - have := strings.Join(stdPkgs, "\n") + "\n" - want := strings.Join(list, "\n") + "\n" - if have != want { - t.Errorf("stdPkgs is out of date: regenerate with 'go generate'\n%s", diff.Diff("stdPkgs", []byte(have), "want", []byte(want))) - } -} diff --git a/internal/backport/go/doc/comment/testdata/README.md b/internal/backport/go/doc/comment/testdata/README.md deleted file mode 100644 index d6f2c54960..0000000000 --- a/internal/backport/go/doc/comment/testdata/README.md +++ /dev/null @@ -1,42 +0,0 @@ -This directory contains test files (*.txt) for the comment parser. - -The files are in [txtar format](https://pkg.go.dev/golang.org/x/tools/txtar). -Consider this example: - - -- input -- - Hello. - -- gofmt -- - Hello. - -- html -- -

Hello. - -- markdown -- - Hello. - -- text -- - Hello. - -Each `-- name --` line introduces a new file with the given name. -The file named “input” must be first and contains the input to -[comment.Parser](https://pkg.go.dev/go/doc/comment/#Parser). - -The remaining files contain the expected output for the named format generated by -[comment.Printer](https://pkg.go.dev/go/doc/comment/#Printer): -“gofmt” for Printer.Comment (Go comment format, as used by gofmt), -“html” for Printer.HTML, “markdown” for Printer.Markdown, and “text” for Printer.Text. -The format can also be “dump” for a textual dump of the raw data structures. - -The text before the `-- input --` line, if present, is JSON to be unmarshalled -to initialize a comment.Printer. For example, this test case sets the Printer's -TextWidth field to 20: - - {"TextWidth": 20} - -- input -- - Package gob manages streams of gobs - binary values exchanged between an - Encoder (transmitter) and a Decoder (receiver). - -- text -- - Package gob - manages streams - of gobs - binary - values exchanged - between an Encoder - (transmitter) and a - Decoder (receiver). diff --git a/internal/backport/go/doc/comment/testdata/blank.txt b/internal/backport/go/doc/comment/testdata/blank.txt deleted file mode 100644 index 9049fde76e..0000000000 --- a/internal/backport/go/doc/comment/testdata/blank.txt +++ /dev/null @@ -1,12 +0,0 @@ --- input -- - $ - Blank line at start and end. - $ --- gofmt -- -Blank line at start and end. --- text -- -Blank line at start and end. --- markdown -- -Blank line at start and end. --- html -- -

Blank line at start and end. diff --git a/internal/backport/go/doc/comment/testdata/code.txt b/internal/backport/go/doc/comment/testdata/code.txt deleted file mode 100644 index 06b1519574..0000000000 --- a/internal/backport/go/doc/comment/testdata/code.txt +++ /dev/null @@ -1,94 +0,0 @@ --- input -- -Text. - A tab-indented - (no, not eight-space indented) - code block and haiku. -More text. - One space - is - enough - to - start - a - block. -More text. - - Blocks - can - - have - blank - lines. --- gofmt -- -Text. - - A tab-indented - (no, not eight-space indented) - code block and haiku. - -More text. - - One space - is - enough - to - start - a - block. - -More text. - - Blocks - can - - have - blank - lines. --- markdown -- -Text. - - A tab-indented - (no, not eight-space indented) - code block and haiku. - -More text. - - One space - is - enough - to - start - a - block. - -More text. - - Blocks - can - - have - blank - lines. --- html -- -

Text. -

A tab-indented
-(no, not eight-space indented)
-code block and haiku.
-
-

More text. -

One space
- is
-  enough
-   to
-    start
-     a
-      block.
-
-

More text. -

    Blocks
-  can
-
-have
-  blank
-    lines.
-
diff --git a/internal/backport/go/doc/comment/testdata/code2.txt b/internal/backport/go/doc/comment/testdata/code2.txt deleted file mode 100644 index 0810bed41c..0000000000 --- a/internal/backport/go/doc/comment/testdata/code2.txt +++ /dev/null @@ -1,31 +0,0 @@ --- input -- -Text. - - A tab-indented - (no, not eight-space indented) - code block and haiku. - -More text. --- gofmt -- -Text. - - A tab-indented - (no, not eight-space indented) - code block and haiku. - -More text. --- markdown -- -Text. - - A tab-indented - (no, not eight-space indented) - code block and haiku. - -More text. --- html -- -

Text. -

A tab-indented
-(no, not eight-space indented)
-code block and haiku.
-
-

More text. diff --git a/internal/backport/go/doc/comment/testdata/code3.txt b/internal/backport/go/doc/comment/testdata/code3.txt deleted file mode 100644 index 4a96a0e9ab..0000000000 --- a/internal/backport/go/doc/comment/testdata/code3.txt +++ /dev/null @@ -1,33 +0,0 @@ --- input -- -Text. - - $ - A tab-indented - (surrounded by more blank lines) - code block and haiku. - $ - -More text. --- gofmt -- -Text. - - A tab-indented - (surrounded by more blank lines) - code block and haiku. - -More text. --- markdown -- -Text. - - A tab-indented - (surrounded by more blank lines) - code block and haiku. - -More text. --- html -- -

Text. -

A tab-indented
-(surrounded by more blank lines)
-code block and haiku.
-
-

More text. diff --git a/internal/backport/go/doc/comment/testdata/code4.txt b/internal/backport/go/doc/comment/testdata/code4.txt deleted file mode 100644 index f128c9aeff..0000000000 --- a/internal/backport/go/doc/comment/testdata/code4.txt +++ /dev/null @@ -1,38 +0,0 @@ --- input -- -To test, run this command: - go test -more - -Or, to test specific things, run this command: - -go test -more \ - -pkg first/package \ - -pkg second/package \ - -pkg third/package - -Happy testing! --- gofmt -- -To test, run this command: - - go test -more - -Or, to test specific things, run this command: - - go test -more \ - -pkg first/package \ - -pkg second/package \ - -pkg third/package - -Happy testing! --- markdown -- -To test, run this command: - - go test -more - -Or, to test specific things, run this command: - - go test -more \ - -pkg first/package \ - -pkg second/package \ - -pkg third/package - -Happy testing! diff --git a/internal/backport/go/doc/comment/testdata/code5.txt b/internal/backport/go/doc/comment/testdata/code5.txt deleted file mode 100644 index 0e340dd129..0000000000 --- a/internal/backport/go/doc/comment/testdata/code5.txt +++ /dev/null @@ -1,21 +0,0 @@ --- input -- -L1 -L2 -L3 -L4 -L5 -- L6 { - L7 -} -L8 --- gofmt -- -L1 -L2 -L3 -L4 -L5 - - L6 { - L7 - } - -L8 diff --git a/internal/backport/go/doc/comment/testdata/code6.txt b/internal/backport/go/doc/comment/testdata/code6.txt deleted file mode 100644 index d2915d1068..0000000000 --- a/internal/backport/go/doc/comment/testdata/code6.txt +++ /dev/null @@ -1,24 +0,0 @@ --- input -- -Run this program: - -func main() { - fmt.Println("hello, world") -} - -Or this: - -go func() { - fmt.Println("hello, world") -}() --- gofmt -- -Run this program: - - func main() { - fmt.Println("hello, world") - } - -Or this: - - go func() { - fmt.Println("hello, world") - }() diff --git a/internal/backport/go/doc/comment/testdata/crash1.txt b/internal/backport/go/doc/comment/testdata/crash1.txt deleted file mode 100644 index 6bb2f6fdda..0000000000 --- a/internal/backport/go/doc/comment/testdata/crash1.txt +++ /dev/null @@ -1,16 +0,0 @@ --- input -- -[] - -[]: http:// --- gofmt -- -[] - -[]: http:// --- html -- -

--- markdown -- -[](http://) --- text -- - - -[]: http:// diff --git a/internal/backport/go/doc/comment/testdata/doclink.txt b/internal/backport/go/doc/comment/testdata/doclink.txt deleted file mode 100644 index a9323471fd..0000000000 --- a/internal/backport/go/doc/comment/testdata/doclink.txt +++ /dev/null @@ -1,21 +0,0 @@ --- input -- -In this package, see [Doc] and [Parser.Parse]. -There is no [Undef] or [Undef.Method]. -See also the [comment] package, -especially [comment.Doc] and [comment.Parser.Parse]. --- gofmt -- -In this package, see [Doc] and [Parser.Parse]. -There is no [Undef] or [Undef.Method]. -See also the [comment] package, -especially [comment.Doc] and [comment.Parser.Parse]. --- text -- -In this package, see Doc and Parser.Parse. There is no [Undef] or -[Undef.Method]. See also the comment package, especially comment.Doc and -comment.Parser.Parse. --- markdown -- -In this package, see [Doc](#Doc) and [Parser.Parse](#Parser.Parse). There is no \[Undef] or \[Undef.Method]. See also the [comment](/go/doc/comment) package, especially [comment.Doc](/go/doc/comment#Doc) and [comment.Parser.Parse](/go/doc/comment#Parser.Parse). --- html -- -

In this package, see Doc and Parser.Parse. -There is no [Undef] or [Undef.Method]. -See also the comment package, -especially comment.Doc and comment.Parser.Parse. diff --git a/internal/backport/go/doc/comment/testdata/doclink2.txt b/internal/backport/go/doc/comment/testdata/doclink2.txt deleted file mode 100644 index ecd8e4e0bc..0000000000 --- a/internal/backport/go/doc/comment/testdata/doclink2.txt +++ /dev/null @@ -1,8 +0,0 @@ --- input -- -We use [io.Reader] a lot, and also a few map[io.Reader]string. - -Never [io.Reader]int or Slice[io.Reader] though. --- markdown -- -We use [io.Reader](/io#Reader) a lot, and also a few map\[io.Reader]string. - -Never \[io.Reader]int or Slice\[io.Reader] though. diff --git a/internal/backport/go/doc/comment/testdata/doclink3.txt b/internal/backport/go/doc/comment/testdata/doclink3.txt deleted file mode 100644 index 0ccfb3df70..0000000000 --- a/internal/backport/go/doc/comment/testdata/doclink3.txt +++ /dev/null @@ -1,8 +0,0 @@ --- input -- -[encoding/json.Marshal] is a doc link. - -[rot13.Marshal] is not. --- markdown -- -[encoding/json.Marshal](/encoding/json#Marshal) is a doc link. - -\[rot13.Marshal] is not. diff --git a/internal/backport/go/doc/comment/testdata/doclink4.txt b/internal/backport/go/doc/comment/testdata/doclink4.txt deleted file mode 100644 index c7095276bf..0000000000 --- a/internal/backport/go/doc/comment/testdata/doclink4.txt +++ /dev/null @@ -1,7 +0,0 @@ --- input -- -[io] at start of comment. -[io] at start of line. -At end of line: [io] -At end of comment: [io] --- markdown -- -[io](/io) at start of comment. [io](/io) at start of line. At end of line: [io](/io) At end of comment: [io](/io) diff --git a/internal/backport/go/doc/comment/testdata/doclink5.txt b/internal/backport/go/doc/comment/testdata/doclink5.txt deleted file mode 100644 index ac7b3ae100..0000000000 --- a/internal/backport/go/doc/comment/testdata/doclink5.txt +++ /dev/null @@ -1,5 +0,0 @@ -{"DocLinkBaseURL": "https://pkg.go.dev"} --- input -- -[encoding/json.Marshal] is a doc link. --- markdown -- -[encoding/json.Marshal](https://pkg.go.dev/encoding/json#Marshal) is a doc link. diff --git a/internal/backport/go/doc/comment/testdata/doclink6.txt b/internal/backport/go/doc/comment/testdata/doclink6.txt deleted file mode 100644 index 1acd03b616..0000000000 --- a/internal/backport/go/doc/comment/testdata/doclink6.txt +++ /dev/null @@ -1,5 +0,0 @@ -{"DocLinkBaseURL": "https://go.dev/pkg/"} --- input -- -[encoding/json.Marshal] is a doc link, and so is [rsc.io/quote.NonExist]. --- markdown -- -[encoding/json.Marshal](https://go.dev/pkg/encoding/json/#Marshal) is a doc link, and so is [rsc.io/quote.NonExist](https://go.dev/pkg/rsc.io/quote/#NonExist). diff --git a/internal/backport/go/doc/comment/testdata/doclink7.txt b/internal/backport/go/doc/comment/testdata/doclink7.txt deleted file mode 100644 index d34979a385..0000000000 --- a/internal/backport/go/doc/comment/testdata/doclink7.txt +++ /dev/null @@ -1,4 +0,0 @@ --- input -- -You see more [*bytes.Buffer] than [bytes.Buffer]. --- markdown -- -You see more [\*bytes.Buffer](/bytes#Buffer) than [bytes.Buffer](/bytes#Buffer). diff --git a/internal/backport/go/doc/comment/testdata/escape.txt b/internal/backport/go/doc/comment/testdata/escape.txt deleted file mode 100644 index f54663f5c3..0000000000 --- a/internal/backport/go/doc/comment/testdata/escape.txt +++ /dev/null @@ -1,55 +0,0 @@ --- input -- -What the ~!@#$%^&*()_+-=`{}|[]\:";',./<>? - -+ Line - -- Line - -* Line - -999. Line - -## Line --- gofmt -- -What the ~!@#$%^&*()_+-=`{}|[]\:";',./<>? - -+ Line - -- Line - -* Line - -999. Line - -## Line --- text -- -What the ~!@#$%^&*()_+-=`{}|[]\:";',./<>? - -+ Line - -- Line - -* Line - -999. Line - -## Line --- markdown -- -What the ~!@#$%^&\*()\_+-=\`{}|\[]\\:";',./\<>? - -\+ Line - -\- Line - -\* Line - -999\. Line - -\## Line --- html -- -

What the ~!@#$%^&*()_+-=`{}|[]\:";',./<>? -

+ Line -

- Line -

* Line -

999. Line -

## Line diff --git a/internal/backport/go/doc/comment/testdata/head.txt b/internal/backport/go/doc/comment/testdata/head.txt deleted file mode 100644 index b99a8c59f3..0000000000 --- a/internal/backport/go/doc/comment/testdata/head.txt +++ /dev/null @@ -1,92 +0,0 @@ --- input -- -Some text. - -An Old Heading - -Not An Old Heading. - -And some text. - -# A New Heading. - -And some more text. - -# Not a heading, -because text follows it. - -Because text precedes it, -# not a heading. - -## Not a heading either. - --- gofmt -- -Some text. - -# An Old Heading - -Not An Old Heading. - -And some text. - -# A New Heading. - -And some more text. - -# Not a heading, -because text follows it. - -Because text precedes it, -# not a heading. - -## Not a heading either. - --- text -- -Some text. - -# An Old Heading - -Not An Old Heading. - -And some text. - -# A New Heading. - -And some more text. - -# Not a heading, because text follows it. - -Because text precedes it, # not a heading. - -## Not a heading either. - --- markdown -- -Some text. - -### An Old Heading {#hdr-An_Old_Heading} - -Not An Old Heading. - -And some text. - -### A New Heading. {#hdr-A_New_Heading_} - -And some more text. - -\# Not a heading, because text follows it. - -Because text precedes it, # not a heading. - -\## Not a heading either. - --- html -- -

Some text. -

An Old Heading

-

Not An Old Heading. -

And some text. -

A New Heading.

-

And some more text. -

# Not a heading, -because text follows it. -

Because text precedes it, -# not a heading. -

## Not a heading either. diff --git a/internal/backport/go/doc/comment/testdata/head2.txt b/internal/backport/go/doc/comment/testdata/head2.txt deleted file mode 100644 index d3576325e0..0000000000 --- a/internal/backport/go/doc/comment/testdata/head2.txt +++ /dev/null @@ -1,36 +0,0 @@ --- input -- -✦ - -Almost a+heading - -✦ - -Don't be a heading - -✦ - -A.b is a heading - -✦ - -A. b is not a heading - -✦ --- gofmt -- -✦ - -Almost a+heading - -✦ - -Don't be a heading - -✦ - -# A.b is a heading - -✦ - -A. b is not a heading - -✦ diff --git a/internal/backport/go/doc/comment/testdata/head3.txt b/internal/backport/go/doc/comment/testdata/head3.txt deleted file mode 100644 index dbb7cb3ffb..0000000000 --- a/internal/backport/go/doc/comment/testdata/head3.txt +++ /dev/null @@ -1,7 +0,0 @@ -{"HeadingLevel": 5} --- input -- -# Heading --- markdown -- -##### Heading {#hdr-Heading} --- html -- -

Heading
diff --git a/internal/backport/go/doc/comment/testdata/hello.txt b/internal/backport/go/doc/comment/testdata/hello.txt deleted file mode 100644 index fb07f1eb75..0000000000 --- a/internal/backport/go/doc/comment/testdata/hello.txt +++ /dev/null @@ -1,35 +0,0 @@ --- input -- - Hello, - world - - This is - a test. --- dump -- -Doc - Paragraph - Plain - "Hello,\n" - "world" - Paragraph - Plain - "This is\n" - "a test." --- gofmt -- -Hello, -world - -This is -a test. --- html -- -

Hello, -world -

This is -a test. --- markdown -- -Hello, world - -This is a test. --- text -- -Hello, world - -This is a test. diff --git a/internal/backport/go/doc/comment/testdata/link.txt b/internal/backport/go/doc/comment/testdata/link.txt deleted file mode 100644 index 551e3065ce..0000000000 --- a/internal/backport/go/doc/comment/testdata/link.txt +++ /dev/null @@ -1,17 +0,0 @@ --- input -- -The Go home page is https://go.dev/. -It used to be https://golang.org. - --- gofmt -- -The Go home page is https://go.dev/. -It used to be https://golang.org. - --- text -- -The Go home page is https://go.dev/. It used to be https://golang.org. - --- markdown -- -The Go home page is [https://go.dev/](https://go.dev/). It used to be [https://golang.org](https://golang.org). - --- html -- -

The Go home page is https://go.dev/. -It used to be https://golang.org. diff --git a/internal/backport/go/doc/comment/testdata/link2.txt b/internal/backport/go/doc/comment/testdata/link2.txt deleted file mode 100644 index 8637a32f01..0000000000 --- a/internal/backport/go/doc/comment/testdata/link2.txt +++ /dev/null @@ -1,31 +0,0 @@ --- input -- -The Go home page is https://go.dev/. -It used to be https://golang.org. -https:// is not a link. -Nor is https:// -https://☺ is not a link. -https://:80 is not a link. - --- gofmt -- -The Go home page is https://go.dev/. -It used to be https://golang.org. -https:// is not a link. -Nor is https:// -https://☺ is not a link. -https://:80 is not a link. - --- text -- -The Go home page is https://go.dev/. It used to be https://golang.org. https:// -is not a link. Nor is https:// https://☺ is not a link. https://:80 is not a -link. - --- markdown -- -The Go home page is [https://go.dev/](https://go.dev/). It used to be [https://golang.org](https://golang.org). https:// is not a link. Nor is https:// https://☺ is not a link. https://:80 is not a link. - --- html -- -

The Go home page is https://go.dev/. -It used to be https://golang.org. -https:// is not a link. -Nor is https:// -https://☺ is not a link. -https://:80 is not a link. diff --git a/internal/backport/go/doc/comment/testdata/link3.txt b/internal/backport/go/doc/comment/testdata/link3.txt deleted file mode 100644 index 5a115b5cb7..0000000000 --- a/internal/backport/go/doc/comment/testdata/link3.txt +++ /dev/null @@ -1,14 +0,0 @@ --- input -- -Doc text. - -[Go home page]: https://go.dev --- gofmt -- -Doc text. - -[Go home page]: https://go.dev --- text -- -Doc text. --- markdown -- -Doc text. --- html -- -

Doc text. diff --git a/internal/backport/go/doc/comment/testdata/link4.txt b/internal/backport/go/doc/comment/testdata/link4.txt deleted file mode 100644 index 75f194c845..0000000000 --- a/internal/backport/go/doc/comment/testdata/link4.txt +++ /dev/null @@ -1,77 +0,0 @@ --- input -- -These are not links. - -[x - -[x]: - -[x]:https://go.dev - -[x]https://go.dev - -[x]: surprise://go.dev - -[x]: surprise! - -But this is, with a tab (although it's unused). - -[z]: https://go.dev --- gofmt -- -These are not links. - -[x - -[x]: - -[x]:https://go.dev - -[x]https://go.dev - -[x]: surprise://go.dev - -[x]: surprise! - -But this is, with a tab (although it's unused). - -[z]: https://go.dev --- text -- -These are not links. - -[x - -[x]: - -[x]:https://go.dev - -[x]https://go.dev - -[x]: surprise://go.dev - -[x]: surprise! - -But this is, with a tab (although it's unused). --- markdown -- -These are not links. - -\[x - -\[x]: - -\[x]:[https://go.dev](https://go.dev) - -\[x][https://go.dev](https://go.dev) - -\[x]: surprise://go.dev - -\[x]: surprise! - -But this is, with a tab (although it's unused). --- html -- -

These are not links. -

[x -

[x]: -

[x]:https://go.dev -

[x]https://go.dev -

[x]: surprise://go.dev -

[x]: surprise! -

But this is, with a tab (although it's unused). diff --git a/internal/backport/go/doc/comment/testdata/link5.txt b/internal/backport/go/doc/comment/testdata/link5.txt deleted file mode 100644 index b4fb5889f4..0000000000 --- a/internal/backport/go/doc/comment/testdata/link5.txt +++ /dev/null @@ -1,36 +0,0 @@ --- input -- -See the [Go home page] and the [pkg -site]. - -[Go home page]: https://go.dev/ -[pkg site]: https://pkg.go.dev -[Go home page]: https://duplicate.ignored - -They're really great! - --- gofmt -- -See the [Go home page] and the [pkg -site]. - -They're really great! - -[Go home page]: https://go.dev/ -[pkg site]: https://pkg.go.dev - -[Go home page]: https://duplicate.ignored - --- text -- -See the Go home page and the pkg site. - -They're really great! - -[Go home page]: https://go.dev/ -[pkg site]: https://pkg.go.dev --- markdown -- -See the [Go home page](https://go.dev/) and the [pkg site](https://pkg.go.dev). - -They're really great! --- html -- -

See the Go home page and the pkg -site. -

They're really great! diff --git a/internal/backport/go/doc/comment/testdata/link6.txt b/internal/backport/go/doc/comment/testdata/link6.txt deleted file mode 100644 index ff629b4573..0000000000 --- a/internal/backport/go/doc/comment/testdata/link6.txt +++ /dev/null @@ -1,50 +0,0 @@ --- input -- -URLs with punctuation are hard. -We don't want to consume the end-of-sentence punctuation. - -For example, https://en.wikipedia.org/wiki/John_Adams_(miniseries). -And https://example.com/[foo]/bar{. -And https://example.com/(foo)/bar! -And https://example.com/{foo}/bar{. -And https://example.com/)baz{foo}. - -[And https://example.com/]. - --- gofmt -- -URLs with punctuation are hard. -We don't want to consume the end-of-sentence punctuation. - -For example, https://en.wikipedia.org/wiki/John_Adams_(miniseries). -And https://example.com/[foo]/bar{. -And https://example.com/(foo)/bar! -And https://example.com/{foo}/bar{. -And https://example.com/)baz{foo}. - -[And https://example.com/]. - --- text -- -URLs with punctuation are hard. We don't want to consume the end-of-sentence -punctuation. - -For example, https://en.wikipedia.org/wiki/John_Adams_(miniseries). -And https://example.com/[foo]/bar{. And https://example.com/(foo)/bar! And -https://example.com/{foo}/bar{. And https://example.com/)baz{foo}. - -[And https://example.com/]. - --- markdown -- -URLs with punctuation are hard. We don't want to consume the end-of-sentence punctuation. - -For example, [https://en.wikipedia.org/wiki/John\_Adams\_(miniseries)](https://en.wikipedia.org/wiki/John_Adams_(miniseries)). And [https://example.com/\[foo]/bar](https://example.com/[foo]/bar){. And [https://example.com/(foo)/bar](https://example.com/(foo)/bar)! And [https://example.com/{foo}/bar](https://example.com/{foo}/bar){. And [https://example.com/](https://example.com/))baz{foo}. - -\[And [https://example.com/](https://example.com/)]. - --- html -- -

URLs with punctuation are hard. -We don't want to consume the end-of-sentence punctuation. -

For example, https://en.wikipedia.org/wiki/John_Adams_(miniseries). -And https://example.com/[foo]/bar{. -And https://example.com/(foo)/bar! -And https://example.com/{foo}/bar{. -And https://example.com/)baz{foo}. -

[And https://example.com/]. diff --git a/internal/backport/go/doc/comment/testdata/link7.txt b/internal/backport/go/doc/comment/testdata/link7.txt deleted file mode 100644 index 89a8b3170e..0000000000 --- a/internal/backport/go/doc/comment/testdata/link7.txt +++ /dev/null @@ -1,25 +0,0 @@ --- input -- -[math] is a package but this is not a doc link. - -[io] is a doc link. - -[math]: https://example.com --- gofmt -- -[math] is a package but this is not a doc link. - -[io] is a doc link. - -[math]: https://example.com --- text -- -math is a package but this is not a doc link. - -io is a doc link. - -[math]: https://example.com --- markdown -- -[math](https://example.com) is a package but this is not a doc link. - -[io](/io) is a doc link. --- html -- -

math is a package but this is not a doc link. -

io is a doc link. diff --git a/internal/backport/go/doc/comment/testdata/linklist.txt b/internal/backport/go/doc/comment/testdata/linklist.txt deleted file mode 100644 index baf40624b3..0000000000 --- a/internal/backport/go/doc/comment/testdata/linklist.txt +++ /dev/null @@ -1,18 +0,0 @@ -{"DocLinkBaseURL": "https://pkg.go.dev"} --- input -- -Did you know? - - - [encoding/json.Marshal] is a doc link. So is [encoding/json.Unmarshal]. --- text -- -Did you know? - - - encoding/json.Marshal is a doc link. So is encoding/json.Unmarshal. --- markdown -- -Did you know? - - - [encoding/json.Marshal](https://pkg.go.dev/encoding/json#Marshal) is a doc link. So is [encoding/json.Unmarshal](https://pkg.go.dev/encoding/json#Unmarshal). --- html -- -

Did you know? -

diff --git a/internal/backport/go/doc/comment/testdata/linklist2.txt b/internal/backport/go/doc/comment/testdata/linklist2.txt deleted file mode 100644 index 81b306100f..0000000000 --- a/internal/backport/go/doc/comment/testdata/linklist2.txt +++ /dev/null @@ -1,39 +0,0 @@ -{"DocLinkBaseURL": "https://pkg.go.dev"} --- input -- -Did you know? - - - [testing.T] is one doc link. - - So is [testing.M]. - - So is [testing.B]. - This is the same list paragraph. - - There is [testing.PB] in this list item, too! --- text -- -Did you know? - - - testing.T is one doc link. - - - So is testing.M. - - - So is testing.B. This is the same list paragraph. - - There is testing.PB in this list item, too! --- markdown -- -Did you know? - - - [testing.T](https://pkg.go.dev/testing#T) is one doc link. - - - So is [testing.M](https://pkg.go.dev/testing#M). - - - So is [testing.B](https://pkg.go.dev/testing#B). This is the same list paragraph. - - There is [testing.PB](https://pkg.go.dev/testing#PB) in this list item, too! --- html -- -

Did you know? -

diff --git a/internal/backport/go/doc/comment/testdata/linklist3.txt b/internal/backport/go/doc/comment/testdata/linklist3.txt deleted file mode 100644 index 701a54ecff..0000000000 --- a/internal/backport/go/doc/comment/testdata/linklist3.txt +++ /dev/null @@ -1,31 +0,0 @@ -{"DocLinkBaseURL": "https://pkg.go.dev"} --- input -- -Cool things: - - - Foo - - [Go] - - Bar - -[Go]: https://go.dev/ --- text -- -Cool things: - - - Foo - - Go - - Bar - -[Go]: https://go.dev/ --- markdown -- -Cool things: - - - Foo - - [Go](https://go.dev/) - - Bar - --- html -- -

Cool things: -

    -
  • Foo -
  • Go -
  • Bar -
diff --git a/internal/backport/go/doc/comment/testdata/linklist4.txt b/internal/backport/go/doc/comment/testdata/linklist4.txt deleted file mode 100644 index db39ec4ee1..0000000000 --- a/internal/backport/go/doc/comment/testdata/linklist4.txt +++ /dev/null @@ -1,36 +0,0 @@ -{"DocLinkBaseURL": "https://pkg.go.dev"} --- input -- -Cool things: - - - Foo - - [Go] is great - - [Go]: https://go.dev/ - - Bar - --- text -- -Cool things: - - - Foo - - - Go is great - - - Bar - -[Go]: https://go.dev/ --- markdown -- -Cool things: - - - Foo - - - [Go](https://go.dev/) is great - - - Bar - --- html -- -

Cool things: -

    -
  • Foo -

  • Go is great -

  • Bar -

diff --git a/internal/backport/go/doc/comment/testdata/list.txt b/internal/backport/go/doc/comment/testdata/list.txt deleted file mode 100644 index 455782f864..0000000000 --- a/internal/backport/go/doc/comment/testdata/list.txt +++ /dev/null @@ -1,48 +0,0 @@ --- input -- -Text. -- Not a list. - - Here is the list. - • Using multiple bullets. - * Indentation does not matter. - + Lots of bullets. -More text. - --- gofmt -- -Text. -- Not a list. - - Here is the list. - - Using multiple bullets. - - Indentation does not matter. - - Lots of bullets. - -More text. - --- text -- -Text. - Not a list. - - Here is the list. - - Using multiple bullets. - - Indentation does not matter. - - Lots of bullets. - -More text. - --- markdown -- -Text. - Not a list. - - - Here is the list. - - Using multiple bullets. - - Indentation does not matter. - - Lots of bullets. - -More text. - --- html -- -

Text. -- Not a list. -

    -
  • Here is the list. -
  • Using multiple bullets. -
  • Indentation does not matter. -
  • Lots of bullets. -
-

More text. diff --git a/internal/backport/go/doc/comment/testdata/list10.txt b/internal/backport/go/doc/comment/testdata/list10.txt deleted file mode 100644 index 9c49083456..0000000000 --- a/internal/backport/go/doc/comment/testdata/list10.txt +++ /dev/null @@ -1,13 +0,0 @@ --- input -- - - 1. This list - 2. Starts the comment - 3. And also has a blank line before it. - -All of which is a little weird. --- gofmt -- - 1. This list - 2. Starts the comment - 3. And also has a blank line before it. - -All of which is a little weird. diff --git a/internal/backport/go/doc/comment/testdata/list2.txt b/internal/backport/go/doc/comment/testdata/list2.txt deleted file mode 100644 index c390b3d59a..0000000000 --- a/internal/backport/go/doc/comment/testdata/list2.txt +++ /dev/null @@ -1,57 +0,0 @@ --- input -- -Text. - 1. Uno - 2) Dos - 3. Tres - 5. Cinco - 7. Siete - 11. Once - 12. Doce - 13. Trece. - --- gofmt -- -Text. - 1. Uno - 2. Dos - 3. Tres - 5. Cinco - 7. Siete - 11. Once - 12. Doce - 13. Trece. - --- text -- -Text. - 1. Uno - 2. Dos - 3. Tres - 5. Cinco - 7. Siete - 11. Once - 12. Doce - 13. Trece. - --- markdown -- -Text. - - 1. Uno - 2. Dos - 3. Tres - 5. Cinco - 7. Siete - 11. Once - 12. Doce - 13. Trece. - --- html -- -

Text. -

    -
  1. Uno -
  2. Dos -
  3. Tres -
  4. Cinco -
  5. Siete -
  6. Once -
  7. Doce -
  8. Trece. -
diff --git a/internal/backport/go/doc/comment/testdata/list3.txt b/internal/backport/go/doc/comment/testdata/list3.txt deleted file mode 100644 index d7d345d2d3..0000000000 --- a/internal/backport/go/doc/comment/testdata/list3.txt +++ /dev/null @@ -1,32 +0,0 @@ --- input -- -Text. - - 1. Uno - 1. Dos - 1. Tres - 1. Quatro - --- gofmt -- -Text. - - 1. Uno - 1. Dos - 1. Tres - 1. Quatro - --- markdown -- -Text. - - 1. Uno - 1. Dos - 1. Tres - 1. Quatro - --- html -- -

Text. -

    -
  1. Uno -
  2. Dos -
  3. Tres -
  4. Quatro -
diff --git a/internal/backport/go/doc/comment/testdata/list4.txt b/internal/backport/go/doc/comment/testdata/list4.txt deleted file mode 100644 index 9c28d65b6c..0000000000 --- a/internal/backport/go/doc/comment/testdata/list4.txt +++ /dev/null @@ -1,38 +0,0 @@ --- input -- -Text. - 1. List -2. Not indented, not a list. - 3. Another list. - --- gofmt -- -Text. - 1. List - -2. Not indented, not a list. - 3. Another list. - --- text -- -Text. - 1. List - -2. Not indented, not a list. - 3. Another list. - --- markdown -- -Text. - - 1. List - -2\. Not indented, not a list. - - 3. Another list. - --- html -- -

Text. -

    -
  1. List -
-

2. Not indented, not a list. -

    -
  1. Another list. -
diff --git a/internal/backport/go/doc/comment/testdata/list5.txt b/internal/backport/go/doc/comment/testdata/list5.txt deleted file mode 100644 index a5128e5b7c..0000000000 --- a/internal/backport/go/doc/comment/testdata/list5.txt +++ /dev/null @@ -1,40 +0,0 @@ --- input -- -Text. - - 1. One - 999999999999999999999. Big - 1000000000000000000000. Bigger - 1000000000000000000001. Biggest - --- gofmt -- -Text. - - 1. One - 999999999999999999999. Big - 1000000000000000000000. Bigger - 1000000000000000000001. Biggest - --- text -- -Text. - - 1. One - 999999999999999999999. Big - 1000000000000000000000. Bigger - 1000000000000000000001. Biggest - --- markdown -- -Text. - - 1. One - 999999999999999999999. Big - 1000000000000000000000. Bigger - 1000000000000000000001. Biggest - --- html -- -

Text. -

    -
  1. One -
  2. Big -
  3. Bigger -
  4. Biggest -
diff --git a/internal/backport/go/doc/comment/testdata/list6.txt b/internal/backport/go/doc/comment/testdata/list6.txt deleted file mode 100644 index ffc0122f52..0000000000 --- a/internal/backport/go/doc/comment/testdata/list6.txt +++ /dev/null @@ -1,129 +0,0 @@ --- input -- -Text. - - List immediately after. - - Another. - -More text. - - - List after blank line. - - Another. - -Even more text. - - List immediately after. - - - Blank line between items. - -Yet more text. - - - Another list after blank line. - - - Blank line between items. - -Still more text. - - One list item. - - Multiple paragraphs. --- dump -- -Doc - Paragraph - Plain "Text." - List ForceBlankBefore=false ForceBlankBetween=false - Item Number="" - Paragraph - Plain "List immediately after." - Item Number="" - Paragraph - Plain "Another." - Paragraph - Plain "More text." - List ForceBlankBefore=true ForceBlankBetween=false - Item Number="" - Paragraph - Plain "List after blank line." - Item Number="" - Paragraph - Plain "Another." - Paragraph - Plain "Even more text." - List ForceBlankBefore=false ForceBlankBetween=true - Item Number="" - Paragraph - Plain "List immediately after." - Item Number="" - Paragraph - Plain "Blank line between items." - Paragraph - Plain "Yet more text." - List ForceBlankBefore=true ForceBlankBetween=true - Item Number="" - Paragraph - Plain "Another list after blank line." - Item Number="" - Paragraph - Plain "Blank line between items." - Paragraph - Plain "Still more text." - List ForceBlankBefore=false ForceBlankBetween=true - Item Number="" - Paragraph - Plain "One list item." - Paragraph - Plain "Multiple paragraphs." - --- gofmt -- -Text. - - List immediately after. - - Another. - -More text. - - - List after blank line. - - Another. - -Even more text. - - - List immediately after. - - - Blank line between items. - -Yet more text. - - - Another list after blank line. - - - Blank line between items. - -Still more text. - - - One list item. - - Multiple paragraphs. - --- markdown -- -Text. - - - List immediately after. - - Another. - -More text. - - - List after blank line. - - Another. - -Even more text. - - - List immediately after. - - - Blank line between items. - -Yet more text. - - - Another list after blank line. - - - Blank line between items. - -Still more text. - - - One list item. - - Multiple paragraphs. - diff --git a/internal/backport/go/doc/comment/testdata/list7.txt b/internal/backport/go/doc/comment/testdata/list7.txt deleted file mode 100644 index 446605061f..0000000000 --- a/internal/backport/go/doc/comment/testdata/list7.txt +++ /dev/null @@ -1,98 +0,0 @@ --- input -- -Almost list markers (but not quite): - - - - -❦ - - - $ - -❦ - - - $ - -❦ - - $ - $ - -❦ - - 1! List. - -❦ --- gofmt -- -Almost list markers (but not quite): - - - - -❦ - - - $ - -❦ - - - $ - -❦ - -❦ - - 1! List. - -❦ --- text -- -Almost list markers (but not quite): - - - - -❦ - - - - -❦ - - - - -❦ - -❦ - - 1! List. - -❦ --- markdown -- -Almost list markers (but not quite): - - - - -❦ - - - $ - -❦ - - - $ - -❦ - -❦ - - 1! List. - -❦ --- html -- -

Almost list markers (but not quite): -

-
-
-

❦ -

- $
-
-

❦ -

- $
-
-

❦ -

❦ -

1! List.
-
-

❦ diff --git a/internal/backport/go/doc/comment/testdata/list8.txt b/internal/backport/go/doc/comment/testdata/list8.txt deleted file mode 100644 index fc46b0d835..0000000000 --- a/internal/backport/go/doc/comment/testdata/list8.txt +++ /dev/null @@ -1,56 +0,0 @@ --- input -- -Loose lists. - - A - - B - - C - D - - E - - F --- gofmt -- -Loose lists. - - - A - - B - - - C - D - - - E - - - F --- text -- -Loose lists. - - - A - - B - - - C D - - - E - - - F --- markdown -- -Loose lists. - - - A - - B - - - C D - - - E - - - F --- html -- -

Loose lists. -

    -
  • A -

    B -

  • C -D -

  • E -

  • F -

diff --git a/internal/backport/go/doc/comment/testdata/list9.txt b/internal/backport/go/doc/comment/testdata/list9.txt deleted file mode 100644 index 48e4673d54..0000000000 --- a/internal/backport/go/doc/comment/testdata/list9.txt +++ /dev/null @@ -1,30 +0,0 @@ --- input -- -Text. - -1. Not a list -2. because it is -3. unindented. - -4. This one - is a list - because of the indented text. -5. More wrapped - items. -6. And unwrapped. - -7. The blank line stops the heuristic. --- gofmt -- -Text. - -1. Not a list -2. because it is -3. unindented. - - 4. This one - is a list - because of the indented text. - 5. More wrapped - items. - 6. And unwrapped. - -7. The blank line stops the heuristic. diff --git a/internal/backport/go/doc/comment/testdata/para.txt b/internal/backport/go/doc/comment/testdata/para.txt deleted file mode 100644 index 2355fa8172..0000000000 --- a/internal/backport/go/doc/comment/testdata/para.txt +++ /dev/null @@ -1,17 +0,0 @@ --- input -- -Hello, world. -This is a paragraph. - --- gofmt -- -Hello, world. -This is a paragraph. - --- text -- -Hello, world. This is a paragraph. - --- markdown -- -Hello, world. This is a paragraph. - --- html -- -

Hello, world. -This is a paragraph. diff --git a/internal/backport/go/doc/comment/testdata/quote.txt b/internal/backport/go/doc/comment/testdata/quote.txt deleted file mode 100644 index b64adae0b3..0000000000 --- a/internal/backport/go/doc/comment/testdata/quote.txt +++ /dev/null @@ -1,15 +0,0 @@ --- input -- -Doubled single quotes like `` and '' turn into Unicode double quotes, -but single quotes ` and ' do not. -Misplaced markdown fences ``` do not either. --- gofmt -- -Doubled single quotes like “ and ” turn into Unicode double quotes, -but single quotes ` and ' do not. -Misplaced markdown fences ``` do not either. --- text -- -Doubled single quotes like “ and ” turn into Unicode double quotes, but single -quotes ` and ' do not. Misplaced markdown fences ``` do not either. --- html -- -

Doubled single quotes like “ and ” turn into Unicode double quotes, -but single quotes ` and ' do not. -Misplaced markdown fences ``` do not either. diff --git a/internal/backport/go/doc/comment/testdata/text.txt b/internal/backport/go/doc/comment/testdata/text.txt deleted file mode 100644 index c4de6e20d2..0000000000 --- a/internal/backport/go/doc/comment/testdata/text.txt +++ /dev/null @@ -1,62 +0,0 @@ -{"TextPrefix":"|", "TextCodePrefix": "@"} --- input -- -Hello, world - Code block here. -More text. -Tight list - - one - - two - - three -Loose list - - one - - - two - - - three - -# Heading - -More text. --- gofmt -- -Hello, world - - Code block here. - -More text. -Tight list - - one - - two - - three - -Loose list - - - one - - - two - - - three - -# Heading - -More text. --- text -- -|Hello, world -| -@Code block here. -| -|More text. Tight list -| - one -| - two -| - three -| -|Loose list -| -| - one -| -| - two -| -| - three -| -|# Heading -| -|More text. diff --git a/internal/backport/go/doc/comment/testdata/text2.txt b/internal/backport/go/doc/comment/testdata/text2.txt deleted file mode 100644 index a099d0b8c6..0000000000 --- a/internal/backport/go/doc/comment/testdata/text2.txt +++ /dev/null @@ -1,14 +0,0 @@ -{"TextWidth": -1} --- input -- -Package gob manages streams of gobs - binary values exchanged between an -Encoder (transmitter) and a Decoder (receiver). A typical use is -transporting arguments and results of remote procedure calls (RPCs) such as -those provided by package "net/rpc". - -The implementation compiles a custom codec for each data type in the stream -and is most efficient when a single Encoder is used to transmit a stream of -values, amortizing the cost of compilation. --- text -- -Package gob manages streams of gobs - binary values exchanged between an Encoder (transmitter) and a Decoder (receiver). A typical use is transporting arguments and results of remote procedure calls (RPCs) such as those provided by package "net/rpc". - -The implementation compiles a custom codec for each data type in the stream and is most efficient when a single Encoder is used to transmit a stream of values, amortizing the cost of compilation. diff --git a/internal/backport/go/doc/comment/testdata/text3.txt b/internal/backport/go/doc/comment/testdata/text3.txt deleted file mode 100644 index 75d2c3765c..0000000000 --- a/internal/backport/go/doc/comment/testdata/text3.txt +++ /dev/null @@ -1,28 +0,0 @@ -{"TextWidth": 30} --- input -- -Package gob manages streams of gobs - binary values exchanged between an -Encoder (transmitter) and a Decoder (receiver). A typical use is -transporting arguments and results of remote procedure calls (RPCs) such as -those provided by package "net/rpc". - -The implementation compiles a custom codec for each data type in the stream -and is most efficient when a single Encoder is used to transmit a stream of -values, amortizing the cost of compilation. --- text -- -Package gob manages streams -of gobs - binary values -exchanged between an Encoder -(transmitter) and a Decoder -(receiver). A typical use is -transporting arguments and -results of remote procedure -calls (RPCs) such as those -provided by package "net/rpc". - -The implementation compiles -a custom codec for each data -type in the stream and is -most efficient when a single -Encoder is used to transmit a -stream of values, amortizing -the cost of compilation. diff --git a/internal/backport/go/doc/comment/testdata/text4.txt b/internal/backport/go/doc/comment/testdata/text4.txt deleted file mode 100644 index e429985077..0000000000 --- a/internal/backport/go/doc/comment/testdata/text4.txt +++ /dev/null @@ -1,29 +0,0 @@ -{"TextWidth": 29} --- input -- -Package gob manages streams of gobs - binary values exchanged between an -Encoder (transmitter) and a Decoder (receiver). A typical use is -transporting arguments and results of remote procedure calls (RPCs) such as -those provided by package "net/rpc". - -The implementation compiles a custom codec for each data type in the stream -and is most efficient when a single Encoder is used to transmit a stream of -values, amortizing the cost of compilation. --- text -- -Package gob manages streams -of gobs - binary values -exchanged between an Encoder -(transmitter) and a Decoder -(receiver). A typical use -is transporting arguments -and results of remote -procedure calls (RPCs) such -as those provided by package -"net/rpc". - -The implementation compiles -a custom codec for each data -type in the stream and is -most efficient when a single -Encoder is used to transmit a -stream of values, amortizing -the cost of compilation. diff --git a/internal/backport/go/doc/comment/testdata/text5.txt b/internal/backport/go/doc/comment/testdata/text5.txt deleted file mode 100644 index 2408fc559d..0000000000 --- a/internal/backport/go/doc/comment/testdata/text5.txt +++ /dev/null @@ -1,38 +0,0 @@ -{"TextWidth": 20} --- input -- -Package gob manages streams of gobs - binary values exchanged between an -Encoder (transmitter) and a Decoder (receiver). A typical use is -transporting arguments and results of remote procedure calls (RPCs) such as -those provided by package "net/rpc". - -The implementation compiles a custom codec for each data type in the stream -and is most efficient when a single Encoder is used to transmit a stream of -values, amortizing the cost of compilation. --- text -- -Package gob -manages streams -of gobs - binary -values exchanged -between an Encoder -(transmitter) and a -Decoder (receiver). -A typical use -is transporting -arguments and -results of remote -procedure calls -(RPCs) such as those -provided by package -"net/rpc". - -The implementation -compiles a custom -codec for each -data type in the -stream and is most -efficient when a -single Encoder is -used to transmit a -stream of values, -amortizing the cost -of compilation. diff --git a/internal/backport/go/doc/comment/testdata/text6.txt b/internal/backport/go/doc/comment/testdata/text6.txt deleted file mode 100644 index d6deff52cf..0000000000 --- a/internal/backport/go/doc/comment/testdata/text6.txt +++ /dev/null @@ -1,18 +0,0 @@ --- input -- -Package gob manages streams of gobs - binary values exchanged between an -Encoder (transmitter) and a Decoder (receiver). A typical use is -transporting arguments and results of remote procedure calls (RPCs) such as -those provided by package "net/rpc". - -The implementation compiles a custom codec for each data type in the stream -and is most efficient when a single Encoder is used to transmit a stream of -values, amortizing the cost of compilation. --- text -- -Package gob manages streams of gobs - binary values exchanged between an Encoder -(transmitter) and a Decoder (receiver). A typical use is transporting arguments -and results of remote procedure calls (RPCs) such as those provided by package -"net/rpc". - -The implementation compiles a custom codec for each data type in the stream and -is most efficient when a single Encoder is used to transmit a stream of values, -amortizing the cost of compilation. diff --git a/internal/backport/go/doc/comment/testdata/text7.txt b/internal/backport/go/doc/comment/testdata/text7.txt deleted file mode 100644 index c9fb6d3754..0000000000 --- a/internal/backport/go/doc/comment/testdata/text7.txt +++ /dev/null @@ -1,21 +0,0 @@ -{"TextPrefix": " "} --- input -- -Package gob manages streams of gobs - binary values exchanged between an -Encoder (transmitter) and a Decoder (receiver). A typical use is -transporting arguments and results of remote procedure calls (RPCs) such as -those provided by package "net/rpc". - -The implementation compiles a custom codec for each data type in the stream -and is most efficient when a single Encoder is used to transmit a stream of -values, amortizing the cost of compilation. --- text -- - Package gob manages streams of gobs - binary values - exchanged between an Encoder (transmitter) and a Decoder - (receiver). A typical use is transporting arguments and - results of remote procedure calls (RPCs) such as those - provided by package "net/rpc". - - The implementation compiles a custom codec for each data - type in the stream and is most efficient when a single - Encoder is used to transmit a stream of values, amortizing - the cost of compilation. diff --git a/internal/backport/go/doc/comment/testdata/text8.txt b/internal/backport/go/doc/comment/testdata/text8.txt deleted file mode 100644 index 560ac951c1..0000000000 --- a/internal/backport/go/doc/comment/testdata/text8.txt +++ /dev/null @@ -1,94 +0,0 @@ -{"TextWidth": 40} --- input -- -If the arguments have version suffixes (like @latest or @v1.0.0), "go install" -builds packages in module-aware mode, ignoring the go.mod file in the current -directory or any parent directory, if there is one. This is useful for -installing executables without affecting the dependencies of the main module. -To eliminate ambiguity about which module versions are used in the build, the -arguments must satisfy the following constraints: - - - Arguments must be package paths or package patterns (with "..." wildcards). - They must not be standard packages (like fmt), meta-patterns (std, cmd, - all), or relative or absolute file paths. - - - All arguments must have the same version suffix. Different queries are not - allowed, even if they refer to the same version. - - - All arguments must refer to packages in the same module at the same version. - - - Package path arguments must refer to main packages. Pattern arguments - will only match main packages. - - - No module is considered the "main" module. If the module containing - packages named on the command line has a go.mod file, it must not contain - directives (replace and exclude) that would cause it to be interpreted - differently than if it were the main module. The module must not require - a higher version of itself. - - - Vendor directories are not used in any module. (Vendor directories are not - included in the module zip files downloaded by 'go install'.) - -If the arguments don't have version suffixes, "go install" may run in -module-aware mode or GOPATH mode, depending on the GO111MODULE environment -variable and the presence of a go.mod file. See 'go help modules' for details. -If module-aware mode is enabled, "go install" runs in the context of the main -module. --- text -- -If the arguments have version suffixes -(like @latest or @v1.0.0), "go install" -builds packages in module-aware mode, -ignoring the go.mod file in the current -directory or any parent directory, -if there is one. This is useful for -installing executables without affecting -the dependencies of the main module. -To eliminate ambiguity about which -module versions are used in the build, -the arguments must satisfy the following -constraints: - - - Arguments must be package paths - or package patterns (with "..." - wildcards). They must not be - standard packages (like fmt), - meta-patterns (std, cmd, all), - or relative or absolute file paths. - - - All arguments must have the same - version suffix. Different queries - are not allowed, even if they refer - to the same version. - - - All arguments must refer to packages - in the same module at the same - version. - - - Package path arguments must refer - to main packages. Pattern arguments - will only match main packages. - - - No module is considered the "main" - module. If the module containing - packages named on the command line - has a go.mod file, it must not - contain directives (replace and - exclude) that would cause it to be - interpreted differently than if it - were the main module. The module - must not require a higher version of - itself. - - - Vendor directories are not used in - any module. (Vendor directories are - not included in the module zip files - downloaded by 'go install'.) - -If the arguments don't have version -suffixes, "go install" may run in -module-aware mode or GOPATH mode, -depending on the GO111MODULE environment -variable and the presence of a go.mod -file. See 'go help modules' for details. -If module-aware mode is enabled, -"go install" runs in the context of the -main module. diff --git a/internal/backport/go/doc/comment/testdata/text9.txt b/internal/backport/go/doc/comment/testdata/text9.txt deleted file mode 100644 index 07a64aa227..0000000000 --- a/internal/backport/go/doc/comment/testdata/text9.txt +++ /dev/null @@ -1,12 +0,0 @@ -{"TextPrefix":"|", "TextCodePrefix": "@"} --- input -- -Hello, world - Code block here. --- gofmt -- -Hello, world - - Code block here. --- text -- -|Hello, world -| -@Code block here. diff --git a/internal/backport/go/doc/comment/testdata/words.txt b/internal/backport/go/doc/comment/testdata/words.txt deleted file mode 100644 index 63c7e1a1b2..0000000000 --- a/internal/backport/go/doc/comment/testdata/words.txt +++ /dev/null @@ -1,10 +0,0 @@ --- input -- -This is an italicword and a linkedword and Unicöde. --- gofmt -- -This is an italicword and a linkedword and Unicöde. --- text -- -This is an italicword and a linkedword and Unicöde. --- markdown -- -This is an *italicword* and a [*linkedword*](https://example.com/linkedword) and Unicöde. --- html -- -

This is an italicword and a linkedword and Unicöde. diff --git a/internal/backport/go/doc/comment/testdata_test.go b/internal/backport/go/doc/comment/testdata_test.go deleted file mode 100644 index fa952d21d0..0000000000 --- a/internal/backport/go/doc/comment/testdata_test.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "bytes" - "encoding/json" - "fmt" - "path/filepath" - "strings" - "testing" - - "golang.org/x/tools/txtar" - "golang.org/x/website/internal/backport/diff" -) - -func TestTestdata(t *testing.T) { - files, _ := filepath.Glob("testdata/*.txt") - if len(files) == 0 { - t.Fatalf("no testdata") - } - var p Parser - p.Words = map[string]string{ - "italicword": "", - "linkedword": "https://example.com/linkedword", - } - p.LookupPackage = func(name string) (importPath string, ok bool) { - if name == "comment" { - return "go/doc/comment", true - } - return DefaultLookupPackage(name) - } - p.LookupSym = func(recv, name string) (ok bool) { - if recv == "Parser" && name == "Parse" || - recv == "" && name == "Doc" || - recv == "" && name == "NoURL" { - return true - } - return false - } - - stripDollars := func(b []byte) []byte { - // Remove trailing $ on lines. - // They make it easier to see lines with trailing spaces, - // as well as turning them into lines without trailing spaces, - // in case editors remove trailing spaces. - return bytes.ReplaceAll(b, []byte("$\n"), []byte("\n")) - } - for _, file := range files { - t.Run(filepath.Base(file), func(t *testing.T) { - var pr Printer - a, err := txtar.ParseFile(file) - if err != nil { - t.Fatal(err) - } - if len(a.Comment) > 0 { - err := json.Unmarshal(a.Comment, &pr) - if err != nil { - t.Fatalf("unmarshalling top json: %v", err) - } - } - if len(a.Files) < 1 || a.Files[0].Name != "input" { - t.Fatalf("first file is not %q", "input") - } - d := p.Parse(string(stripDollars(a.Files[0].Data))) - for _, f := range a.Files[1:] { - want := stripDollars(f.Data) - for len(want) >= 2 && want[len(want)-1] == '\n' && want[len(want)-2] == '\n' { - want = want[:len(want)-1] - } - var out []byte - switch f.Name { - default: - t.Fatalf("unknown output file %q", f.Name) - case "dump": - out = dump(d) - case "gofmt": - out = pr.Comment(d) - case "html": - out = pr.HTML(d) - case "markdown": - out = pr.Markdown(d) - case "text": - out = pr.Text(d) - } - if string(out) != string(want) { - t.Errorf("%s: %s", file, diff.Diff(f.Name, want, "have", out)) - } - } - }) - } -} - -func dump(d *Doc) []byte { - var out bytes.Buffer - dumpTo(&out, 0, d) - return out.Bytes() -} - -func dumpTo(out *bytes.Buffer, indent int, x interface{}) { - switch x := x.(type) { - default: - fmt.Fprintf(out, "?%T", x) - - case *Doc: - fmt.Fprintf(out, "Doc") - dumpTo(out, indent+1, x.Content) - if len(x.Links) > 0 { - dumpNL(out, indent+1) - fmt.Fprintf(out, "Links") - dumpTo(out, indent+2, x.Links) - } - fmt.Fprintf(out, "\n") - - case []*LinkDef: - for _, def := range x { - dumpNL(out, indent) - dumpTo(out, indent, def) - } - - case *LinkDef: - fmt.Fprintf(out, "LinkDef Used:%v Text:%q URL:%s", x.Used, x.Text, x.URL) - - case []Block: - for _, blk := range x { - dumpNL(out, indent) - dumpTo(out, indent, blk) - } - - case *Heading: - fmt.Fprintf(out, "Heading") - dumpTo(out, indent+1, x.Text) - - case *List: - fmt.Fprintf(out, "List ForceBlankBefore=%v ForceBlankBetween=%v", x.ForceBlankBefore, x.ForceBlankBetween) - dumpTo(out, indent+1, x.Items) - - case []*ListItem: - for _, item := range x { - dumpNL(out, indent) - dumpTo(out, indent, item) - } - - case *ListItem: - fmt.Fprintf(out, "Item Number=%q", x.Number) - dumpTo(out, indent+1, x.Content) - - case *Paragraph: - fmt.Fprintf(out, "Paragraph") - dumpTo(out, indent+1, x.Text) - - case *Code: - fmt.Fprintf(out, "Code") - dumpTo(out, indent+1, x.Text) - - case []Text: - for _, t := range x { - dumpNL(out, indent) - dumpTo(out, indent, t) - } - - case Plain: - if !strings.Contains(string(x), "\n") { - fmt.Fprintf(out, "Plain %q", string(x)) - } else { - fmt.Fprintf(out, "Plain") - dumpTo(out, indent+1, string(x)) - } - - case Italic: - if !strings.Contains(string(x), "\n") { - fmt.Fprintf(out, "Italic %q", string(x)) - } else { - fmt.Fprintf(out, "Italic") - dumpTo(out, indent+1, string(x)) - } - - case string: - for _, line := range strings.SplitAfter(x, "\n") { - if line != "" { - dumpNL(out, indent) - fmt.Fprintf(out, "%q", line) - } - } - - case *Link: - fmt.Fprintf(out, "Link %q", x.URL) - dumpTo(out, indent+1, x.Text) - - case *DocLink: - fmt.Fprintf(out, "DocLink pkg:%q, recv:%q, name:%q", x.ImportPath, x.Recv, x.Name) - dumpTo(out, indent+1, x.Text) - } -} - -func dumpNL(out *bytes.Buffer, n int) { - out.WriteByte('\n') - for i := 0; i < n; i++ { - out.WriteByte('\t') - } -} diff --git a/internal/backport/go/doc/comment/text.go b/internal/backport/go/doc/comment/text.go deleted file mode 100644 index 4ab2da4712..0000000000 --- a/internal/backport/go/doc/comment/text.go +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "bytes" - "fmt" - "sort" - "strings" - "unicode/utf8" -) - -// A textPrinter holds the state needed for printing a Doc as plain text. -type textPrinter struct { - *Printer - long strings.Builder - prefix string - codePrefix string - width int -} - -// Text returns a textual formatting of the Doc. -// See the [Printer] documentation for ways to customize the text output. -func (p *Printer) Text(d *Doc) []byte { - tp := &textPrinter{ - Printer: p, - prefix: p.TextPrefix, - codePrefix: p.TextCodePrefix, - width: p.TextWidth, - } - if tp.codePrefix == "" { - tp.codePrefix = p.TextPrefix + "\t" - } - if tp.width == 0 { - tp.width = 80 - utf8.RuneCountInString(tp.prefix) - } - - var out bytes.Buffer - for i, x := range d.Content { - if i > 0 && blankBefore(x) { - out.WriteString(tp.prefix) - writeNL(&out) - } - tp.block(&out, x) - } - anyUsed := false - for _, def := range d.Links { - if def.Used { - anyUsed = true - break - } - } - if anyUsed { - writeNL(&out) - for _, def := range d.Links { - if def.Used { - fmt.Fprintf(&out, "[%s]: %s\n", def.Text, def.URL) - } - } - } - return out.Bytes() -} - -// writeNL calls out.WriteByte('\n') -// but first trims trailing spaces on the previous line. -func writeNL(out *bytes.Buffer) { - // Trim trailing spaces. - data := out.Bytes() - n := 0 - for n < len(data) && (data[len(data)-n-1] == ' ' || data[len(data)-n-1] == '\t') { - n++ - } - if n > 0 { - out.Truncate(len(data) - n) - } - out.WriteByte('\n') -} - -// block prints the block x to out. -func (p *textPrinter) block(out *bytes.Buffer, x Block) { - switch x := x.(type) { - default: - fmt.Fprintf(out, "?%T\n", x) - - case *Paragraph: - out.WriteString(p.prefix) - p.text(out, "", x.Text) - - case *Heading: - out.WriteString(p.prefix) - out.WriteString("# ") - p.text(out, "", x.Text) - - case *Code: - text := x.Text - for text != "" { - var line string - line, text, _ = stringsCut(text, "\n") - if line != "" { - out.WriteString(p.codePrefix) - out.WriteString(line) - } - writeNL(out) - } - - case *List: - loose := x.BlankBetween() - for i, item := range x.Items { - if i > 0 && loose { - out.WriteString(p.prefix) - writeNL(out) - } - out.WriteString(p.prefix) - out.WriteString(" ") - if item.Number == "" { - out.WriteString(" - ") - } else { - out.WriteString(item.Number) - out.WriteString(". ") - } - for i, blk := range item.Content { - const fourSpace = " " - if i > 0 { - writeNL(out) - out.WriteString(p.prefix) - out.WriteString(fourSpace) - } - p.text(out, fourSpace, blk.(*Paragraph).Text) - } - } - } -} - -// text prints the text sequence x to out. -func (p *textPrinter) text(out *bytes.Buffer, indent string, x []Text) { - p.oneLongLine(&p.long, x) - words := strings.Fields(p.long.String()) - p.long.Reset() - - var seq []int - if p.width < 0 || len(words) == 0 { - seq = []int{0, len(words)} // one long line - } else { - seq = wrap(words, p.width-utf8.RuneCountInString(indent)) - } - for i := 0; i+1 < len(seq); i++ { - if i > 0 { - out.WriteString(p.prefix) - out.WriteString(indent) - } - for j, w := range words[seq[i]:seq[i+1]] { - if j > 0 { - out.WriteString(" ") - } - out.WriteString(w) - } - writeNL(out) - } -} - -// oneLongLine prints the text sequence x to out as one long line, -// without worrying about line wrapping. -// Explicit links have the [ ] dropped to improve readability. -func (p *textPrinter) oneLongLine(out *strings.Builder, x []Text) { - for _, t := range x { - switch t := t.(type) { - case Plain: - out.WriteString(string(t)) - case Italic: - out.WriteString(string(t)) - case *Link: - p.oneLongLine(out, t.Text) - case *DocLink: - p.oneLongLine(out, t.Text) - } - } -} - -// wrap wraps words into lines of at most max runes, -// minimizing the sum of the squares of the leftover lengths -// at the end of each line (except the last, of course), -// with a preference for ending lines at punctuation (.,:;). -// -// The returned slice gives the indexes of the first words -// on each line in the wrapped text with a final entry of len(words). -// Thus the lines are words[seq[0]:seq[1]], words[seq[1]:seq[2]], -// ..., words[seq[len(seq)-2]:seq[len(seq)-1]]. -// -// The implementation runs in O(n log n) time, where n = len(words), -// using the algorithm described in D. S. Hirschberg and L. L. Larmore, -// “[The least weight subsequence problem],” FOCS 1985, pp. 137-143. -// -// [The least weight subsequence problem]: https://doi.org/10.1109/SFCS.1985.60 -func wrap(words []string, max int) (seq []int) { - // The algorithm requires that our scoring function be concave, - // meaning that for all i₀ ≤ i₁ < j₀ ≤ j₁, - // weight(i₀, j₀) + weight(i₁, j₁) ≤ weight(i₀, j₁) + weight(i₁, j₀). - // - // Our weights are two-element pairs [hi, lo] - // ordered by elementwise comparison. - // The hi entry counts the weight for lines that are longer than max, - // and the lo entry counts the weight for lines that are not. - // This forces the algorithm to first minimize the number of lines - // that are longer than max, which correspond to lines with - // single very long words. Having done that, it can move on to - // minimizing the lo score, which is more interesting. - // - // The lo score is the sum for each line of the square of the - // number of spaces remaining at the end of the line and a - // penalty of 64 given out for not ending the line in a - // punctuation character (.,:;). - // The penalty is somewhat arbitrarily chosen by trying - // different amounts and judging how nice the wrapped text looks. - // Roughly speaking, using 64 means that we are willing to - // end a line with eight blank spaces in order to end at a - // punctuation character, even if the next word would fit in - // those spaces. - // - // We care about ending in punctuation characters because - // it makes the text easier to skim if not too many sentences - // or phrases begin with a single word on the previous line. - - // A score is the score (also called weight) for a given line. - // add and cmp add and compare scores. - type score struct { - hi int64 - lo int64 - } - add := func(s, t score) score { return score{s.hi + t.hi, s.lo + t.lo} } - cmp := func(s, t score) int { - switch { - case s.hi < t.hi: - return -1 - case s.hi > t.hi: - return +1 - case s.lo < t.lo: - return -1 - case s.lo > t.lo: - return +1 - } - return 0 - } - - // total[j] is the total number of runes - // (including separating spaces) in words[:j]. - total := make([]int, len(words)+1) - total[0] = 0 - for i, s := range words { - total[1+i] = total[i] + utf8.RuneCountInString(s) + 1 - } - - // weight returns weight(i, j). - weight := func(i, j int) score { - // On the last line, there is zero weight for being too short. - n := total[j] - 1 - total[i] - if j == len(words) && n <= max { - return score{0, 0} - } - - // Otherwise the weight is the penalty plus the square of the number of - // characters remaining on the line or by which the line goes over. - // In the latter case, that value goes in the hi part of the score. - // (See note above.) - p := wrapPenalty(words[j-1]) - v := int64(max-n) * int64(max-n) - if n > max { - return score{v, p} - } - return score{0, v + p} - } - - // The rest of this function is “The Basic Algorithm” from - // Hirschberg and Larmore's conference paper, - // using the same names as in the paper. - f := []score{{0, 0}} - g := func(i, j int) score { return add(f[i], weight(i, j)) } - - bridge := func(a, b, c int) bool { - k := c + sort.Search(len(words)+1-c, func(k int) bool { - k += c - return cmp(g(a, k), g(b, k)) > 0 - }) - if k > len(words) { - return true - } - return cmp(g(c, k), g(b, k)) <= 0 - } - - // d is a one-ended deque implemented as a slice. - d := make([]int, 1, len(words)) - d[0] = 0 - bestleft := make([]int, 1, len(words)) - bestleft[0] = -1 - for m := 1; m < len(words); m++ { - f = append(f, g(d[0], m)) - bestleft = append(bestleft, d[0]) - for len(d) > 1 && cmp(g(d[1], m+1), g(d[0], m+1)) <= 0 { - d = d[1:] // “Retire” - } - for len(d) > 1 && bridge(d[len(d)-2], d[len(d)-1], m) { - d = d[:len(d)-1] // “Fire” - } - if cmp(g(m, len(words)), g(d[len(d)-1], len(words))) < 0 { - d = append(d, m) // “Hire” - // The next few lines are not in the paper but are necessary - // to handle two-word inputs correctly. It appears to be - // just a bug in the paper's pseudocode. - if len(d) == 2 && cmp(g(d[1], m+1), g(d[0], m+1)) <= 0 { - d = d[1:] - } - } - } - bestleft = append(bestleft, d[0]) - - // Recover least weight sequence from bestleft. - n := 1 - for m := len(words); m > 0; m = bestleft[m] { - n++ - } - seq = make([]int, n) - for m := len(words); m > 0; m = bestleft[m] { - n-- - seq[n] = m - } - return seq -} - -// wrapPenalty is the penalty for inserting a line break after word s. -func wrapPenalty(s string) int64 { - switch s[len(s)-1] { - case '.', ',', ':', ';': - return 0 - } - return 64 -} diff --git a/internal/backport/go/doc/comment/wrap_test.go b/internal/backport/go/doc/comment/wrap_test.go deleted file mode 100644 index f9802c9c44..0000000000 --- a/internal/backport/go/doc/comment/wrap_test.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package comment - -import ( - "flag" - "fmt" - "math/rand" - "testing" - "time" - "unicode/utf8" -) - -var wrapSeed = flag.Int64("wrapseed", 0, "use `seed` for wrap test (default auto-seeds)") - -func TestWrap(t *testing.T) { - if *wrapSeed == 0 { - *wrapSeed = time.Now().UnixNano() - } - t.Logf("-wrapseed=%#x\n", *wrapSeed) - r := rand.New(rand.NewSource(*wrapSeed)) - - // Generate words of random length. - s := "1234567890αβcdefghijklmnopqrstuvwxyz" - sN := utf8.RuneCountInString(s) - var words []string - for i := 0; i < 100; i++ { - n := 1 + r.Intn(sN-1) - if n >= 12 { - n++ // extra byte for β - } - if n >= 11 { - n++ // extra byte for α - } - words = append(words, s[:n]) - } - - for n := 1; n <= len(words) && !t.Failed(); n++ { - t.Run(fmt.Sprint("n=", n), func(t *testing.T) { - words := words[:n] - t.Logf("words: %v", words) - for max := 1; max < 100 && !t.Failed(); max++ { - t.Run(fmt.Sprint("max=", max), func(t *testing.T) { - seq := wrap(words, max) - - // Compute score for seq. - start := 0 - score := int64(0) - if len(seq) == 0 { - t.Fatalf("wrap seq is empty") - } - if seq[0] != 0 { - t.Fatalf("wrap seq does not start with 0") - } - for _, n := range seq[1:] { - if n <= start { - t.Fatalf("wrap seq is non-increasing: %v", seq) - } - if n > len(words) { - t.Fatalf("wrap seq contains %d > %d: %v", n, len(words), seq) - } - size := -1 - for _, s := range words[start:n] { - size += 1 + utf8.RuneCountInString(s) - } - if n-start == 1 && size >= max { - // no score - } else if size > max { - t.Fatalf("wrap used overlong line %d:%d: %v", start, n, words[start:n]) - } else if n != len(words) { - score += int64(max-size)*int64(max-size) + wrapPenalty(words[n-1]) - } - start = n - } - if start != len(words) { - t.Fatalf("wrap seq does not use all words (%d < %d): %v", start, len(words), seq) - } - - // Check that score matches slow reference implementation. - slowSeq, slowScore := wrapSlow(words, max) - if score != slowScore { - t.Fatalf("wrap score = %d != wrapSlow score %d\nwrap: %v\nslow: %v", score, slowScore, seq, slowSeq) - } - }) - } - }) - } -} - -// wrapSlow is an O(n²) reference implementation for wrap. -// It returns a minimal-score sequence along with the score. -// It is OK if wrap returns a different sequence as long as that -// sequence has the same score. -func wrapSlow(words []string, max int) (seq []int, score int64) { - // Quadratic dynamic programming algorithm for line wrapping problem. - // best[i] tracks the best score possible for words[:i], - // assuming that for i < len(words) the line breaks after those words. - // bestleft[i] tracks the previous line break for best[i]. - best := make([]int64, len(words)+1) - bestleft := make([]int, len(words)+1) - best[0] = 0 - for i, w := range words { - if utf8.RuneCountInString(w) >= max { - // Overlong word must appear on line by itself. No effect on score. - best[i+1] = best[i] - continue - } - best[i+1] = 1e18 - p := wrapPenalty(w) - n := -1 - for j := i; j >= 0; j-- { - n += 1 + utf8.RuneCountInString(words[j]) - if n > max { - break - } - line := int64(n-max)*int64(n-max) + p - if i == len(words)-1 { - line = 0 // no score for final line being too short - } - s := best[j] + line - if best[i+1] > s { - best[i+1] = s - bestleft[i+1] = j - } - } - } - - // Recover least weight sequence from bestleft. - n := 1 - for m := len(words); m > 0; m = bestleft[m] { - n++ - } - seq = make([]int, n) - for m := len(words); m > 0; m = bestleft[m] { - n-- - seq[n] = m - } - return seq, best[len(words)] -} diff --git a/internal/backport/go/doc/comment_test.go b/internal/backport/go/doc/comment_test.go deleted file mode 100644 index fba8a7581a..0000000000 --- a/internal/backport/go/doc/comment_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import ( - "bytes" - "testing" - - "golang.org/x/website/internal/backport/diff" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -func TestComment(t *testing.T) { - fset := token.NewFileSet() - pkgs, err := parser.ParseDir(fset, "testdata/pkgdoc", nil, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - if pkgs["pkgdoc"] == nil { - t.Fatal("missing package pkgdoc") - } - pkg := New(pkgs["pkgdoc"], "testdata/pkgdoc", 0) - - var ( - input = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link. [rand.Int] and [crand.Reader] are things.\n" - wantHTML = `

T and U are types, and T.M is a method, but [V] is a broken link. rand.Int and crand.Reader are things.` + "\n" - wantOldHTML = "

[T] and [U] are types, and [T.M] is a method, but [V] is a broken link. [rand.Int] and [crand.Reader] are things.\n" - wantMarkdown = "[T](#T) and [U](#U) are types, and [T.M](#T.M) is a method, but \\[V] is a broken link. [rand.Int](/math/rand#Int) and [crand.Reader](/crypto/rand#Reader) are things.\n" - wantText = "T and U are types, and T.M is a method, but [V] is a broken link. rand.Int and\ncrand.Reader are things.\n" - wantOldText = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link.\n[rand.Int] and [crand.Reader] are things.\n" - wantSynopsis = "T and U are types, and T.M is a method, but [V] is a broken link." - wantOldSynopsis = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link." - ) - - if b := pkg.HTML(input); string(b) != wantHTML { - t.Errorf("%s", diff.Diff("pkg.HTML", b, "want", []byte(wantHTML))) - } - if b := pkg.Markdown(input); string(b) != wantMarkdown { - t.Errorf("%s", diff.Diff("pkg.Markdown", b, "want", []byte(wantMarkdown))) - } - if b := pkg.Text(input); string(b) != wantText { - t.Errorf("%s", diff.Diff("pkg.Text", b, "want", []byte(wantText))) - } - if b := pkg.Synopsis(input); b != wantSynopsis { - t.Errorf("%s", diff.Diff("pkg.Synopsis", []byte(b), "want", []byte(wantText))) - } - - var buf bytes.Buffer - - buf.Reset() - ToHTML(&buf, input, map[string]string{"types": ""}) - if b := buf.Bytes(); string(b) != wantOldHTML { - t.Errorf("%s", diff.Diff("ToHTML", b, "want", []byte(wantOldHTML))) - } - - buf.Reset() - ToText(&buf, input, "", "\t", 80) - if b := buf.Bytes(); string(b) != wantOldText { - t.Errorf("%s", diff.Diff("ToText", b, "want", []byte(wantOldText))) - } - - if b := Synopsis(input); b != wantOldSynopsis { - t.Errorf("%s", diff.Diff("Synopsis", []byte(b), "want", []byte(wantOldText))) - } -} diff --git a/internal/backport/go/doc/doc.go b/internal/backport/go/doc/doc.go deleted file mode 100644 index ba1dd39104..0000000000 --- a/internal/backport/go/doc/doc.go +++ /dev/null @@ -1,350 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package doc extracts source code documentation from a Go AST. -package doc - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/doc/comment" - "golang.org/x/website/internal/backport/go/token" - "strings" -) - -// Package is the documentation for an entire package. -type Package struct { - Doc string - Name string - ImportPath string - Imports []string - Filenames []string - Notes map[string][]*Note - - // Deprecated: For backward compatibility Bugs is still populated, - // but all new code should use Notes instead. - Bugs []string - - // declarations - Consts []*Value - Types []*Type - Vars []*Value - Funcs []*Func - - // Examples is a sorted list of examples associated with - // the package. Examples are extracted from _test.go files - // provided to NewFromFiles. - Examples []*Example - - importByName map[string]string - syms map[string]bool -} - -// Value is the documentation for a (possibly grouped) var or const declaration. -type Value struct { - Doc string - Names []string // var or const names in declaration order - Decl *ast.GenDecl - - order int -} - -// Type is the documentation for a type declaration. -type Type struct { - Doc string - Name string - Decl *ast.GenDecl - - // associated declarations - Consts []*Value // sorted list of constants of (mostly) this type - Vars []*Value // sorted list of variables of (mostly) this type - Funcs []*Func // sorted list of functions returning this type - Methods []*Func // sorted list of methods (including embedded ones) of this type - - // Examples is a sorted list of examples associated with - // this type. Examples are extracted from _test.go files - // provided to NewFromFiles. - Examples []*Example -} - -// Func is the documentation for a func declaration. -type Func struct { - Doc string - Name string - Decl *ast.FuncDecl - - // methods - // (for functions, these fields have the respective zero value) - Recv string // actual receiver "T" or "*T" - Orig string // original receiver "T" or "*T" - Level int // embedding level; 0 means not embedded - - // Examples is a sorted list of examples associated with this - // function or method. Examples are extracted from _test.go files - // provided to NewFromFiles. - Examples []*Example -} - -// A Note represents a marked comment starting with "MARKER(uid): note body". -// Any note with a marker of 2 or more upper case [A-Z] letters and a uid of -// at least one character is recognized. The ":" following the uid is optional. -// Notes are collected in the Package.Notes map indexed by the notes marker. -type Note struct { - Pos, End token.Pos // position range of the comment containing the marker - UID string // uid found with the marker - Body string // note body text -} - -// Mode values control the operation of New and NewFromFiles. -type Mode int - -const ( - // AllDecls says to extract documentation for all package-level - // declarations, not just exported ones. - AllDecls Mode = 1 << iota - - // AllMethods says to show all embedded methods, not just the ones of - // invisible (unexported) anonymous fields. - AllMethods - - // PreserveAST says to leave the AST unmodified. Originally, pieces of - // the AST such as function bodies were nil-ed out to save memory in - // godoc, but not all programs want that behavior. - PreserveAST -) - -// New computes the package documentation for the given package AST. -// New takes ownership of the AST pkg and may edit or overwrite it. -// To have the Examples fields populated, use NewFromFiles and include -// the package's _test.go files. -func New(pkg *ast.Package, importPath string, mode Mode) *Package { - var r reader - r.readPackage(pkg, mode) - r.computeMethodSets() - r.cleanupTypes() - p := &Package{ - Doc: r.doc, - Name: pkg.Name, - ImportPath: importPath, - Imports: sortedKeys(r.imports), - Filenames: r.filenames, - Notes: r.notes, - Bugs: noteBodies(r.notes["BUG"]), - Consts: sortedValues(r.values, token.CONST), - Types: sortedTypes(r.types, mode&AllMethods != 0), - Vars: sortedValues(r.values, token.VAR), - Funcs: sortedFuncs(r.funcs, true), - - importByName: r.importByName, - syms: make(map[string]bool), - } - - p.collectValues(p.Consts) - p.collectValues(p.Vars) - p.collectTypes(p.Types) - p.collectFuncs(p.Funcs) - - return p -} - -func (p *Package) collectValues(values []*Value) { - for _, v := range values { - for _, name := range v.Names { - p.syms[name] = true - } - } -} - -func (p *Package) collectTypes(types []*Type) { - for _, t := range types { - if p.syms[t.Name] { - // Shouldn't be any cycles but stop just in case. - continue - } - p.syms[t.Name] = true - p.collectValues(t.Consts) - p.collectValues(t.Vars) - p.collectFuncs(t.Funcs) - p.collectFuncs(t.Methods) - } -} - -func (p *Package) collectFuncs(funcs []*Func) { - for _, f := range funcs { - if f.Recv != "" { - p.syms[strings.TrimPrefix(f.Recv, "*")+"."+f.Name] = true - } else { - p.syms[f.Name] = true - } - } -} - -// NewFromFiles computes documentation for a package. -// -// The package is specified by a list of *ast.Files and corresponding -// file set, which must not be nil. -// NewFromFiles uses all provided files when computing documentation, -// so it is the caller's responsibility to provide only the files that -// match the desired build context. "go/build".Context.MatchFile can -// be used for determining whether a file matches a build context with -// the desired GOOS and GOARCH values, and other build constraints. -// The import path of the package is specified by importPath. -// -// Examples found in _test.go files are associated with the corresponding -// type, function, method, or the package, based on their name. -// If the example has a suffix in its name, it is set in the -// Example.Suffix field. Examples with malformed names are skipped. -// -// Optionally, a single extra argument of type Mode can be provided to -// control low-level aspects of the documentation extraction behavior. -// -// NewFromFiles takes ownership of the AST files and may edit them, -// unless the PreserveAST Mode bit is on. -func NewFromFiles(fset *token.FileSet, files []*ast.File, importPath string, opts ...interface{}) (*Package, error) { - // Check for invalid API usage. - if fset == nil { - panic(fmt.Errorf("doc.NewFromFiles: no token.FileSet provided (fset == nil)")) - } - var mode Mode - switch len(opts) { // There can only be 0 or 1 options, so a simple switch works for now. - case 0: - // Nothing to do. - case 1: - m, ok := opts[0].(Mode) - if !ok { - panic(fmt.Errorf("doc.NewFromFiles: option argument type must be doc.Mode")) - } - mode = m - default: - panic(fmt.Errorf("doc.NewFromFiles: there must not be more than 1 option argument")) - } - - // Collect .go and _test.go files. - var ( - goFiles = make(map[string]*ast.File) - testGoFiles []*ast.File - ) - for i := range files { - f := fset.File(files[i].Pos()) - if f == nil { - return nil, fmt.Errorf("file files[%d] is not found in the provided file set", i) - } - switch name := f.Name(); { - case strings.HasSuffix(name, ".go") && !strings.HasSuffix(name, "_test.go"): - goFiles[name] = files[i] - case strings.HasSuffix(name, "_test.go"): - testGoFiles = append(testGoFiles, files[i]) - default: - return nil, fmt.Errorf("file files[%d] filename %q does not have a .go extension", i, name) - } - } - - // TODO(dmitshur,gri): A relatively high level call to ast.NewPackage with a simpleImporter - // ast.Importer implementation is made below. It might be possible to short-circuit and simplify. - - // Compute package documentation. - pkg, _ := ast.NewPackage(fset, goFiles, simpleImporter, nil) // Ignore errors that can happen due to unresolved identifiers. - p := New(pkg, importPath, mode) - classifyExamples(p, Examples(testGoFiles...)) - return p, nil -} - -// simpleImporter returns a (dummy) package object named by the last path -// component of the provided package path (as is the convention for packages). -// This is sufficient to resolve package identifiers without doing an actual -// import. It never returns an error. -func simpleImporter(imports map[string]*ast.Object, path string) (*ast.Object, error) { - pkg := imports[path] - if pkg == nil { - // note that strings.LastIndex returns -1 if there is no "/" - pkg = ast.NewObj(ast.Pkg, path[strings.LastIndex(path, "/")+1:]) - pkg.Data = ast.NewScope(nil) // required by ast.NewPackage for dot-import - imports[path] = pkg - } - return pkg, nil -} - -// lookupSym reports whether the package has a given symbol or method. -// -// If recv == "", HasSym reports whether the package has a top-level -// const, func, type, or var named name. -// -// If recv != "", HasSym reports whether the package has a type -// named recv with a method named name. -func (p *Package) lookupSym(recv, name string) bool { - if recv != "" { - return p.syms[recv+"."+name] - } - return p.syms[name] -} - -// lookupPackage returns the import path identified by name -// in the given package. If name uniquely identifies a single import, -// then lookupPackage returns that import. -// If multiple packages are imported as name, importPath returns "", false. -// Otherwise, if name is the name of p itself, importPath returns "", true, -// to signal a reference to p. -// Otherwise, importPath returns "", false. -func (p *Package) lookupPackage(name string) (importPath string, ok bool) { - if path, ok := p.importByName[name]; ok { - if path == "" { - return "", false // multiple imports used the name - } - return path, true // found import - } - if p.Name == name { - return "", true // allow reference to this package - } - return "", false // unknown name -} - -// Parser returns a doc comment parser configured -// for parsing doc comments from package p. -// Each call returns a new parser, so that the caller may -// customize it before use. -func (p *Package) Parser() *comment.Parser { - return &comment.Parser{ - LookupPackage: p.lookupPackage, - LookupSym: p.lookupSym, - } -} - -// Printer returns a doc comment printer configured -// for printing doc comments from package p. -// Each call returns a new printer, so that the caller may -// customize it before use. -func (p *Package) Printer() *comment.Printer { - // No customization today, but having p.Printer() - // gives us flexibility in the future, and it is convenient for callers. - return &comment.Printer{} -} - -// HTML returns formatted HTML for the doc comment text. -// -// To customize details of the HTML, use [Package.Printer] -// to obtain a [comment.Printer], and configure it -// before calling its HTML method. -func (p *Package) HTML(text string) []byte { - return p.Printer().HTML(p.Parser().Parse(text)) -} - -// Markdown returns formatted Markdown for the doc comment text. -// -// To customize details of the Markdown, use [Package.Printer] -// to obtain a [comment.Printer], and configure it -// before calling its Markdown method. -func (p *Package) Markdown(text string) []byte { - return p.Printer().Markdown(p.Parser().Parse(text)) -} - -// Text returns formatted text for the doc comment text, -// wrapped to 80 Unicode code points and using tabs for -// code block indentation. -// -// To customize details of the formatting, use [Package.Printer] -// to obtain a [comment.Printer], and configure it -// before calling its Text method. -func (p *Package) Text(text string) []byte { - return p.Printer().Text(p.Parser().Parse(text)) -} diff --git a/internal/backport/go/doc/doc_test.go b/internal/backport/go/doc/doc_test.go deleted file mode 100644 index 8448fb310c..0000000000 --- a/internal/backport/go/doc/doc_test.go +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import ( - "bytes" - "flag" - "fmt" - "io/fs" - "os" - "path/filepath" - "regexp" - "strings" - "testing" - "text/template" - - "golang.org/x/website/internal/backport/diff" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/printer" - "golang.org/x/website/internal/backport/go/token" -) - -var update = flag.Bool("update", false, "update golden (.out) files") -var files = flag.String("files", "", "consider only Go test files matching this regular expression") - -const dataDir = "testdata" - -var templateTxt = readTemplate("template.txt") - -func readTemplate(filename string) *template.Template { - t := template.New(filename) - t.Funcs(template.FuncMap{ - "node": nodeFmt, - "synopsis": synopsisFmt, - "indent": indentFmt, - }) - return template.Must(t.ParseFiles(filepath.Join(dataDir, filename))) -} - -func nodeFmt(node interface{}, fset *token.FileSet) string { - var buf bytes.Buffer - printer.Fprint(&buf, fset, node) - return strings.ReplaceAll(strings.TrimSpace(buf.String()), "\n", "\n\t") -} - -func synopsisFmt(s string) string { - const n = 64 - if len(s) > n { - // cut off excess text and go back to a word boundary - s = s[0:n] - if i := strings.LastIndexAny(s, "\t\n "); i >= 0 { - s = s[0:i] - } - s = strings.TrimSpace(s) + " ..." - } - return "// " + strings.ReplaceAll(s, "\n", " ") -} - -func indentFmt(indent, s string) string { - end := "" - if strings.HasSuffix(s, "\n") { - end = "\n" - s = s[:len(s)-1] - } - return indent + strings.ReplaceAll(s, "\n", "\n"+indent) + end -} - -func isGoFile(fi fs.FileInfo) bool { - name := fi.Name() - return !fi.IsDir() && - len(name) > 0 && name[0] != '.' && // ignore .files - filepath.Ext(name) == ".go" -} - -type bundle struct { - *Package - FSet *token.FileSet -} - -func test(t *testing.T, mode Mode) { - // determine file filter - filter := isGoFile - if *files != "" { - rx, err := regexp.Compile(*files) - if err != nil { - t.Fatal(err) - } - filter = func(fi fs.FileInfo) bool { - return isGoFile(fi) && rx.MatchString(fi.Name()) - } - } - - // get packages - fset := token.NewFileSet() - pkgs, err := parser.ParseDir(fset, dataDir, filter, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - - // test packages - for _, pkg := range pkgs { - t.Run(pkg.Name, func(t *testing.T) { - importPath := dataDir + "/" + pkg.Name - var files []*ast.File - for _, f := range pkg.Files { - files = append(files, f) - } - doc, err := NewFromFiles(fset, files, importPath, mode) - if err != nil { - t.Fatal(err) - } - - // golden files always use / in filenames - canonicalize them - for i, filename := range doc.Filenames { - doc.Filenames[i] = filepath.ToSlash(filename) - } - - // print documentation - var buf bytes.Buffer - if err := templateTxt.Execute(&buf, bundle{doc, fset}); err != nil { - t.Fatal(err) - } - got := buf.Bytes() - - // update golden file if necessary - golden := filepath.Join(dataDir, fmt.Sprintf("%s.%d.golden", pkg.Name, mode)) - if *update { - err := os.WriteFile(golden, got, 0644) - if err != nil { - t.Fatal(err) - } - } - - // get golden file - want, err := os.ReadFile(golden) - if err != nil { - t.Fatal(err) - } - - // compare - if !bytes.Equal(got, want) { - t.Errorf("package %s\n\t%s", pkg.Name, diff.Diff("got", got, "want", want)) - } - }) - } -} - -func Test(t *testing.T) { - t.Run("default", func(t *testing.T) { test(t, 0) }) - t.Run("AllDecls", func(t *testing.T) { test(t, AllDecls) }) - t.Run("AllMethods", func(t *testing.T) { test(t, AllMethods) }) -} - -/* generics - -func TestFuncs(t *testing.T) { - fset := token.NewFileSet() - file, err := parser.ParseFile(fset, "funcs.go", strings.NewReader(funcsTestFile), parser.ParseComments) - if err != nil { - t.Fatal(err) - } - doc, err := NewFromFiles(fset, []*ast.File{file}, "importPath", Mode(0)) - if err != nil { - t.Fatal(err) - } - - for _, f := range doc.Funcs { - f.Decl = nil - } - for _, ty := range doc.Types { - for _, f := range ty.Funcs { - f.Decl = nil - } - for _, m := range ty.Methods { - m.Decl = nil - } - } - - compareFuncs := func(t *testing.T, msg string, got, want *Func) { - // ignore Decl and Examples - got.Decl = nil - got.Examples = nil - if !(got.Doc == want.Doc && - got.Name == want.Name && - got.Recv == want.Recv && - got.Orig == want.Orig && - got.Level == want.Level) { - t.Errorf("%s:\ngot %+v\nwant %+v", msg, got, want) - } - } - - compareSlices(t, "Funcs", doc.Funcs, funcsPackage.Funcs, compareFuncs) - compareSlices(t, "Types", doc.Types, funcsPackage.Types, func(t *testing.T, msg string, got, want *Type) { - if got.Name != want.Name { - t.Errorf("%s.Name: got %q, want %q", msg, got.Name, want.Name) - } else { - compareSlices(t, got.Name+".Funcs", got.Funcs, want.Funcs, compareFuncs) - compareSlices(t, got.Name+".Methods", got.Methods, want.Methods, compareFuncs) - } - }) -} - -func compareSlices[E interface{}](t *testing.T, name string, got, want []E, compareElem func(*testing.T, string, E, E)) { - if len(got) != len(want) { - t.Errorf("%s: got %d, want %d", name, len(got), len(want)) - } - for i := 0; i < len(got) && i < len(want); i++ { - compareElem(t, fmt.Sprintf("%s[%d]", name, i), got[i], want[i]) - } -} -*/ - -const funcsTestFile = ` -package funcs - -func F() {} - -type S1 struct { - S2 // embedded, exported - s3 // embedded, unexported -} - -func NewS1() S1 {return S1{} } -func NewS1p() *S1 { return &S1{} } - -func (S1) M1() {} -func (r S1) M2() {} -func(S1) m3() {} // unexported not shown -func (*S1) P1() {} // pointer receiver - -type S2 int -func (S2) M3() {} // shown on S2 - -type s3 int -func (s3) M4() {} // shown on S1 - -type G1[T interface{}] struct { - *s3 -} - -func NewG1[T interface{}]() G1[T] { return G1[T]{} } - -func (G1[T]) MG1() {} -func (*G1[U]) MG2() {} - -type G2[T, U interface{}] struct {} - -func NewG2[T, U interface{}]() G2[T, U] { return G2[T, U]{} } - -func (G2[T, U]) MG3() {} -func (*G2[A, B]) MG4() {} - - -` - -var funcsPackage = &Package{ - Funcs: []*Func{{Name: "F"}}, - Types: []*Type{ - { - Name: "G1", - Funcs: []*Func{{Name: "NewG1"}}, - Methods: []*Func{ - {Name: "M4", Recv: "G1", // TODO: synthesize a param for G1? - Orig: "s3", Level: 1}, - {Name: "MG1", Recv: "G1[T]", Orig: "G1[T]", Level: 0}, - {Name: "MG2", Recv: "*G1[U]", Orig: "*G1[U]", Level: 0}, - }, - }, - { - Name: "G2", - Funcs: []*Func{{Name: "NewG2"}}, - Methods: []*Func{ - {Name: "MG3", Recv: "G2[T, U]", Orig: "G2[T, U]", Level: 0}, - {Name: "MG4", Recv: "*G2[A, B]", Orig: "*G2[A, B]", Level: 0}, - }, - }, - { - Name: "S1", - Funcs: []*Func{{Name: "NewS1"}, {Name: "NewS1p"}}, - Methods: []*Func{ - {Name: "M1", Recv: "S1", Orig: "S1", Level: 0}, - {Name: "M2", Recv: "S1", Orig: "S1", Level: 0}, - {Name: "M4", Recv: "S1", Orig: "s3", Level: 1}, - {Name: "P1", Recv: "*S1", Orig: "*S1", Level: 0}, - }, - }, - { - Name: "S2", - Methods: []*Func{ - {Name: "M3", Recv: "S2", Orig: "S2", Level: 0}, - }, - }, - }, -} diff --git a/internal/backport/go/doc/example.go b/internal/backport/go/doc/example.go deleted file mode 100644 index 959c4f243f..0000000000 --- a/internal/backport/go/doc/example.go +++ /dev/null @@ -1,723 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Extract example functions from file ASTs. - -package doc - -import ( - "path" - "regexp" - "sort" - "strconv" - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" -) - -// An Example represents an example function found in a test source file. -type Example struct { - Name string // name of the item being exemplified (including optional suffix) - Suffix string // example suffix, without leading '_' (only populated by NewFromFiles) - Doc string // example function doc string - Code ast.Node - Play *ast.File // a whole program version of the example - Comments []*ast.CommentGroup - Output string // expected output - Unordered bool - EmptyOutput bool // expect empty output - Order int // original source code order -} - -// Examples returns the examples found in testFiles, sorted by Name field. -// The Order fields record the order in which the examples were encountered. -// The Suffix field is not populated when Examples is called directly, it is -// only populated by NewFromFiles for examples it finds in _test.go files. -// -// Playable Examples must be in a package whose name ends in "_test". -// An Example is "playable" (the Play field is non-nil) in either of these -// circumstances: -// - The example function is self-contained: the function references only -// identifiers from other packages (or predeclared identifiers, such as -// "int") and the test file does not include a dot import. -// - The entire test file is the example: the file contains exactly one -// example function, zero test, fuzz test, or benchmark function, and at -// least one top-level function, type, variable, or constant declaration -// other than the example function. -func Examples(testFiles ...*ast.File) []*Example { - var list []*Example - for _, file := range testFiles { - hasTests := false // file contains tests, fuzz test, or benchmarks - numDecl := 0 // number of non-import declarations in the file - var flist []*Example - for _, decl := range file.Decls { - if g, ok := decl.(*ast.GenDecl); ok && g.Tok != token.IMPORT { - numDecl++ - continue - } - f, ok := decl.(*ast.FuncDecl) - if !ok || f.Recv != nil { - continue - } - numDecl++ - name := f.Name.Name - if isTest(name, "Test") || isTest(name, "Benchmark") || isTest(name, "Fuzz") { - hasTests = true - continue - } - if !isTest(name, "Example") { - continue - } - if params := f.Type.Params; len(params.List) != 0 { - continue // function has params; not a valid example - } - if f.Body == nil { // ast.File.Body nil dereference (see issue 28044) - continue - } - var doc string - if f.Doc != nil { - doc = f.Doc.Text() - } - output, unordered, hasOutput := exampleOutput(f.Body, file.Comments) - flist = append(flist, &Example{ - Name: name[len("Example"):], - Doc: doc, - Code: f.Body, - Play: playExample(file, f), - Comments: file.Comments, - Output: output, - Unordered: unordered, - EmptyOutput: output == "" && hasOutput, - Order: len(flist), - }) - } - if !hasTests && numDecl > 1 && len(flist) == 1 { - // If this file only has one example function, some - // other top-level declarations, and no tests or - // benchmarks, use the whole file as the example. - flist[0].Code = file - flist[0].Play = playExampleFile(file) - } - list = append(list, flist...) - } - // sort by name - sort.Slice(list, func(i, j int) bool { - return list[i].Name < list[j].Name - }) - return list -} - -var outputPrefix = regexp.MustCompile(`(?i)^[[:space:]]*(unordered )?output:`) - -// Extracts the expected output and whether there was a valid output comment -func exampleOutput(b *ast.BlockStmt, comments []*ast.CommentGroup) (output string, unordered, ok bool) { - if _, last := lastComment(b, comments); last != nil { - // test that it begins with the correct prefix - text := last.Text() - if loc := outputPrefix.FindStringSubmatchIndex(text); loc != nil { - if loc[2] != -1 { - unordered = true - } - text = text[loc[1]:] - // Strip zero or more spaces followed by \n or a single space. - text = strings.TrimLeft(text, " ") - if len(text) > 0 && text[0] == '\n' { - text = text[1:] - } - return text, unordered, true - } - } - return "", false, false // no suitable comment found -} - -// isTest tells whether name looks like a test, example, fuzz test, or -// benchmark. It is a Test (say) if there is a character after Test that is not -// a lower-case letter. (We don't want Testiness.) -func isTest(name, prefix string) bool { - if !strings.HasPrefix(name, prefix) { - return false - } - if len(name) == len(prefix) { // "Test" is ok - return true - } - rune, _ := utf8.DecodeRuneInString(name[len(prefix):]) - return !unicode.IsLower(rune) -} - -// playExample synthesizes a new *ast.File based on the provided -// file with the provided function body as the body of main. -func playExample(file *ast.File, f *ast.FuncDecl) *ast.File { - body := f.Body - - if !strings.HasSuffix(file.Name.Name, "_test") { - // We don't support examples that are part of the - // greater package (yet). - return nil - } - - // Collect top-level declarations in the file. - topDecls := make(map[*ast.Object]ast.Decl) - typMethods := make(map[string][]ast.Decl) - - for _, decl := range file.Decls { - switch d := decl.(type) { - case *ast.FuncDecl: - if d.Recv == nil { - topDecls[d.Name.Obj] = d - } else { - if len(d.Recv.List) == 1 { - t := d.Recv.List[0].Type - tname, _ := baseTypeName(t) - typMethods[tname] = append(typMethods[tname], d) - } - } - case *ast.GenDecl: - for _, spec := range d.Specs { - switch s := spec.(type) { - case *ast.TypeSpec: - topDecls[s.Name.Obj] = d - case *ast.ValueSpec: - for _, name := range s.Names { - topDecls[name.Obj] = d - } - } - } - } - } - - // Find unresolved identifiers and uses of top-level declarations. - depDecls, unresolved := findDeclsAndUnresolved(body, topDecls, typMethods) - - // Remove predeclared identifiers from unresolved list. - for n := range unresolved { - if predeclaredTypes[n] || predeclaredConstants[n] || predeclaredFuncs[n] { - delete(unresolved, n) - } - } - - // Use unresolved identifiers to determine the imports used by this - // example. The heuristic assumes package names match base import - // paths for imports w/o renames (should be good enough most of the time). - var namedImports []ast.Spec - var blankImports []ast.Spec // _ imports - - // To preserve the blank lines between groups of imports, find the - // start position of each group, and assign that position to all - // imports from that group. - groupStarts := findImportGroupStarts(file.Imports) - groupStart := func(s *ast.ImportSpec) token.Pos { - for i, start := range groupStarts { - if s.Path.ValuePos < start { - return groupStarts[i-1] - } - } - return groupStarts[len(groupStarts)-1] - } - - for _, s := range file.Imports { - p, err := strconv.Unquote(s.Path.Value) - if err != nil { - continue - } - if p == "syscall/js" { - // We don't support examples that import syscall/js, - // because the package syscall/js is not available in the playground. - return nil - } - n := path.Base(p) - if s.Name != nil { - n = s.Name.Name - switch n { - case "_": - blankImports = append(blankImports, s) - continue - case ".": - // We can't resolve dot imports (yet). - return nil - } - } - if unresolved[n] { - // Copy the spec and its path to avoid modifying the original. - spec := *s - path := *s.Path - spec.Path = &path - spec.Path.ValuePos = groupStart(&spec) - namedImports = append(namedImports, &spec) - delete(unresolved, n) - } - } - - // If there are other unresolved identifiers, give up because this - // synthesized file is not going to build. - if len(unresolved) > 0 { - return nil - } - - // Include documentation belonging to blank imports. - var comments []*ast.CommentGroup - for _, s := range blankImports { - if c := s.(*ast.ImportSpec).Doc; c != nil { - comments = append(comments, c) - } - } - - // Include comments that are inside the function body. - for _, c := range file.Comments { - if body.Pos() <= c.Pos() && c.End() <= body.End() { - comments = append(comments, c) - } - } - - // Strip the "Output:" or "Unordered output:" comment and adjust body - // end position. - body, comments = stripOutputComment(body, comments) - - // Include documentation belonging to dependent declarations. - for _, d := range depDecls { - switch d := d.(type) { - case *ast.GenDecl: - if d.Doc != nil { - comments = append(comments, d.Doc) - } - case *ast.FuncDecl: - if d.Doc != nil { - comments = append(comments, d.Doc) - } - } - } - - // Synthesize import declaration. - importDecl := &ast.GenDecl{ - Tok: token.IMPORT, - Lparen: 1, // Need non-zero Lparen and Rparen so that printer - Rparen: 1, // treats this as a factored import. - } - importDecl.Specs = append(namedImports, blankImports...) - - // Synthesize main function. - funcDecl := &ast.FuncDecl{ - Name: ast.NewIdent("main"), - Type: f.Type, - Body: body, - } - - decls := make([]ast.Decl, 0, 2+len(depDecls)) - decls = append(decls, importDecl) - decls = append(decls, depDecls...) - decls = append(decls, funcDecl) - - sort.Slice(decls, func(i, j int) bool { - return decls[i].Pos() < decls[j].Pos() - }) - sort.Slice(comments, func(i, j int) bool { - return comments[i].Pos() < comments[j].Pos() - }) - - // Synthesize file. - return &ast.File{ - Name: ast.NewIdent("main"), - Decls: decls, - Comments: comments, - } -} - -// findDeclsAndUnresolved returns all the top-level declarations mentioned in -// the body, and a set of unresolved symbols (those that appear in the body but -// have no declaration in the program). -// -// topDecls maps objects to the top-level declaration declaring them (not -// necessarily obj.Decl, as obj.Decl will be a Spec for GenDecls, but -// topDecls[obj] will be the GenDecl itself). -func findDeclsAndUnresolved(body ast.Node, topDecls map[*ast.Object]ast.Decl, typMethods map[string][]ast.Decl) ([]ast.Decl, map[string]bool) { - // This function recursively finds every top-level declaration used - // transitively by the body, populating usedDecls and usedObjs. Then it - // trims down the declarations to include only the symbols actually - // referenced by the body. - - unresolved := make(map[string]bool) - var depDecls []ast.Decl - usedDecls := make(map[ast.Decl]bool) // set of top-level decls reachable from the body - usedObjs := make(map[*ast.Object]bool) // set of objects reachable from the body (each declared by a usedDecl) - - var inspectFunc func(ast.Node) bool - inspectFunc = func(n ast.Node) bool { - switch e := n.(type) { - case *ast.Ident: - if e.Obj == nil && e.Name != "_" { - unresolved[e.Name] = true - } else if d := topDecls[e.Obj]; d != nil { - - usedObjs[e.Obj] = true - if !usedDecls[d] { - usedDecls[d] = true - depDecls = append(depDecls, d) - } - } - return true - case *ast.SelectorExpr: - // For selector expressions, only inspect the left hand side. - // (For an expression like fmt.Println, only add "fmt" to the - // set of unresolved names, not "Println".) - ast.Inspect(e.X, inspectFunc) - return false - case *ast.KeyValueExpr: - // For key value expressions, only inspect the value - // as the key should be resolved by the type of the - // composite literal. - ast.Inspect(e.Value, inspectFunc) - return false - } - return true - } - - inspectFieldList := func(fl *ast.FieldList) { - if fl != nil { - for _, f := range fl.List { - ast.Inspect(f.Type, inspectFunc) - } - } - } - - // Find the decls immediately referenced by body. - ast.Inspect(body, inspectFunc) - // Now loop over them, adding to the list when we find a new decl that the - // body depends on. Keep going until we don't find anything new. - for i := 0; i < len(depDecls); i++ { - switch d := depDecls[i].(type) { - case *ast.FuncDecl: - // Inpect type parameters. - inspectFieldList(d.Type.TypeParams) - // Inspect types of parameters and results. See #28492. - inspectFieldList(d.Type.Params) - inspectFieldList(d.Type.Results) - - // Functions might not have a body. See #42706. - if d.Body != nil { - ast.Inspect(d.Body, inspectFunc) - } - case *ast.GenDecl: - for _, spec := range d.Specs { - switch s := spec.(type) { - case *ast.TypeSpec: - inspectFieldList(s.TypeParams) - ast.Inspect(s.Type, inspectFunc) - depDecls = append(depDecls, typMethods[s.Name.Name]...) - case *ast.ValueSpec: - if s.Type != nil { - ast.Inspect(s.Type, inspectFunc) - } - for _, val := range s.Values { - ast.Inspect(val, inspectFunc) - } - } - } - } - } - - // Some decls include multiple specs, such as a variable declaration with - // multiple variables on the same line, or a parenthesized declaration. Trim - // the declarations to include only the specs that are actually mentioned. - // However, if there is a constant group with iota, leave it all: later - // constant declarations in the group may have no value and so cannot stand - // on their own, and removing any constant from the group could change the - // values of subsequent ones. - // See testdata/examples/iota.go for a minimal example. - var ds []ast.Decl - for _, d := range depDecls { - switch d := d.(type) { - case *ast.FuncDecl: - ds = append(ds, d) - case *ast.GenDecl: - containsIota := false // does any spec have iota? - // Collect all Specs that were mentioned in the example. - var specs []ast.Spec - for _, s := range d.Specs { - switch s := s.(type) { - case *ast.TypeSpec: - if usedObjs[s.Name.Obj] { - specs = append(specs, s) - } - case *ast.ValueSpec: - if !containsIota { - containsIota = hasIota(s) - } - // A ValueSpec may have multiple names (e.g. "var a, b int"). - // Keep only the names that were mentioned in the example. - // Exception: the multiple names have a single initializer (which - // would be a function call with multiple return values). In that - // case, keep everything. - if len(s.Names) > 1 && len(s.Values) == 1 { - specs = append(specs, s) - continue - } - ns := *s - ns.Names = nil - ns.Values = nil - for i, n := range s.Names { - if usedObjs[n.Obj] { - ns.Names = append(ns.Names, n) - if s.Values != nil { - ns.Values = append(ns.Values, s.Values[i]) - } - } - } - if len(ns.Names) > 0 { - specs = append(specs, &ns) - } - } - } - if len(specs) > 0 { - // Constant with iota? Keep it all. - if d.Tok == token.CONST && containsIota { - ds = append(ds, d) - } else { - // Synthesize a GenDecl with just the Specs we need. - nd := *d // copy the GenDecl - nd.Specs = specs - if len(specs) == 1 { - // Remove grouping parens if there is only one spec. - nd.Lparen = 0 - } - ds = append(ds, &nd) - } - } - } - } - return ds, unresolved -} - -func hasIota(s ast.Spec) bool { - has := false - ast.Inspect(s, func(n ast.Node) bool { - // Check that this is the special built-in "iota" identifier, not - // a user-defined shadow. - if id, ok := n.(*ast.Ident); ok && id.Name == "iota" && id.Obj == nil { - has = true - return false - } - return true - }) - return has -} - -// findImportGroupStarts finds the start positions of each sequence of import -// specs that are not separated by a blank line. -func findImportGroupStarts(imps []*ast.ImportSpec) []token.Pos { - startImps := findImportGroupStarts1(imps) - groupStarts := make([]token.Pos, len(startImps)) - for i, imp := range startImps { - groupStarts[i] = imp.Pos() - } - return groupStarts -} - -// Helper for findImportGroupStarts to ease testing. -func findImportGroupStarts1(origImps []*ast.ImportSpec) []*ast.ImportSpec { - // Copy to avoid mutation. - imps := make([]*ast.ImportSpec, len(origImps)) - copy(imps, origImps) - // Assume the imports are sorted by position. - sort.Slice(imps, func(i, j int) bool { return imps[i].Pos() < imps[j].Pos() }) - // Assume gofmt has been applied, so there is a blank line between adjacent imps - // if and only if they are more than 2 positions apart (newline, tab). - var groupStarts []*ast.ImportSpec - prevEnd := token.Pos(-2) - for _, imp := range imps { - if imp.Pos()-prevEnd > 2 { - groupStarts = append(groupStarts, imp) - } - prevEnd = imp.End() - // Account for end-of-line comments. - if imp.Comment != nil { - prevEnd = imp.Comment.End() - } - } - return groupStarts -} - -// playExampleFile takes a whole file example and synthesizes a new *ast.File -// such that the example is function main in package main. -func playExampleFile(file *ast.File) *ast.File { - // Strip copyright comment if present. - comments := file.Comments - if len(comments) > 0 && strings.HasPrefix(comments[0].Text(), "Copyright") { - comments = comments[1:] - } - - // Copy declaration slice, rewriting the ExampleX function to main. - var decls []ast.Decl - for _, d := range file.Decls { - if f, ok := d.(*ast.FuncDecl); ok && isTest(f.Name.Name, "Example") { - // Copy the FuncDecl, as it may be used elsewhere. - newF := *f - newF.Name = ast.NewIdent("main") - newF.Body, comments = stripOutputComment(f.Body, comments) - d = &newF - } - decls = append(decls, d) - } - - // Copy the File, as it may be used elsewhere. - f := *file - f.Name = ast.NewIdent("main") - f.Decls = decls - f.Comments = comments - return &f -} - -// stripOutputComment finds and removes the "Output:" or "Unordered output:" -// comment from body and comments, and adjusts the body block's end position. -func stripOutputComment(body *ast.BlockStmt, comments []*ast.CommentGroup) (*ast.BlockStmt, []*ast.CommentGroup) { - // Do nothing if there is no "Output:" or "Unordered output:" comment. - i, last := lastComment(body, comments) - if last == nil || !outputPrefix.MatchString(last.Text()) { - return body, comments - } - - // Copy body and comments, as the originals may be used elsewhere. - newBody := &ast.BlockStmt{ - Lbrace: body.Lbrace, - List: body.List, - Rbrace: last.Pos(), - } - newComments := make([]*ast.CommentGroup, len(comments)-1) - copy(newComments, comments[:i]) - copy(newComments[i:], comments[i+1:]) - return newBody, newComments -} - -// lastComment returns the last comment inside the provided block. -func lastComment(b *ast.BlockStmt, c []*ast.CommentGroup) (i int, last *ast.CommentGroup) { - if b == nil { - return - } - pos, end := b.Pos(), b.End() - for j, cg := range c { - if cg.Pos() < pos { - continue - } - if cg.End() > end { - break - } - i, last = j, cg - } - return -} - -// classifyExamples classifies examples and assigns them to the Examples field -// of the relevant Func, Type, or Package that the example is associated with. -// -// The classification process is ambiguous in some cases: -// -// - ExampleFoo_Bar matches a type named Foo_Bar -// or a method named Foo.Bar. -// - ExampleFoo_bar matches a type named Foo_bar -// or Foo (with a "bar" suffix). -// -// Examples with malformed names are not associated with anything. -func classifyExamples(p *Package, examples []*Example) { - if len(examples) == 0 { - return - } - // Mapping of names for funcs, types, and methods to the example listing. - ids := make(map[string]*[]*Example) - ids[""] = &p.Examples // package-level examples have an empty name - for _, f := range p.Funcs { - if !token.IsExported(f.Name) { - continue - } - ids[f.Name] = &f.Examples - } - for _, t := range p.Types { - if !token.IsExported(t.Name) { - continue - } - ids[t.Name] = &t.Examples - for _, f := range t.Funcs { - if !token.IsExported(f.Name) { - continue - } - ids[f.Name] = &f.Examples - } - for _, m := range t.Methods { - if !token.IsExported(m.Name) { - continue - } - ids[strings.TrimPrefix(nameWithoutInst(m.Recv), "*")+"_"+m.Name] = &m.Examples - } - } - - // Group each example with the associated func, type, or method. - for _, ex := range examples { - // Consider all possible split points for the suffix - // by starting at the end of string (no suffix case), - // then trying all positions that contain a '_' character. - // - // An association is made on the first successful match. - // Examples with malformed names that match nothing are skipped. - for i := len(ex.Name); i >= 0; i = strings.LastIndexByte(ex.Name[:i], '_') { - prefix, suffix, ok := splitExampleName(ex.Name, i) - if !ok { - continue - } - exs, ok := ids[prefix] - if !ok { - continue - } - ex.Suffix = suffix - *exs = append(*exs, ex) - break - } - } - - // Sort list of example according to the user-specified suffix name. - for _, exs := range ids { - sort.Slice((*exs), func(i, j int) bool { - return (*exs)[i].Suffix < (*exs)[j].Suffix - }) - } -} - -// nameWithoutInst returns name if name has no brackets. If name contains -// brackets, then it returns name with all the contents between (and including) -// the outermost left and right bracket removed. -// -// Adapted from debug/gosym/symtab.go:Sym.nameWithoutInst. -func nameWithoutInst(name string) string { - start := strings.Index(name, "[") - if start < 0 { - return name - } - end := strings.LastIndex(name, "]") - if end < 0 { - // Malformed name, should contain closing bracket too. - return name - } - return name[0:start] + name[end+1:] -} - -// splitExampleName attempts to split example name s at index i, -// and reports if that produces a valid split. The suffix may be -// absent. Otherwise, it must start with a lower-case letter and -// be preceded by '_'. -// -// One of i == len(s) or s[i] == '_' must be true. -func splitExampleName(s string, i int) (prefix, suffix string, ok bool) { - if i == len(s) { - return s, "", true - } - if i == len(s)-1 { - return "", "", false - } - prefix, suffix = s[:i], s[i+1:] - return prefix, suffix, isExampleSuffix(suffix) -} - -func isExampleSuffix(s string) bool { - r, size := utf8.DecodeRuneInString(s) - return size > 0 && unicode.IsLower(r) -} diff --git a/internal/backport/go/doc/example_internal_test.go b/internal/backport/go/doc/example_internal_test.go deleted file mode 100644 index 82ce982f72..0000000000 --- a/internal/backport/go/doc/example_internal_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import ( - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" - "reflect" - "strconv" - "strings" - "testing" -) - -func TestImportGroupStarts(t *testing.T) { - for _, test := range []struct { - name string - in string - want []string // paths of group-starting imports - }{ - { - name: "one group", - in: `package p -import ( - "a" - "b" - "c" - "d" -) -`, - want: []string{"a"}, - }, - { - name: "several groups", - in: `package p -import ( - "a" - - "b" - "c" - - "d" -) -`, - want: []string{"a", "b", "d"}, - }, - { - name: "extra space", - in: `package p -import ( - "a" - - - "b" - "c" - - - "d" -) -`, - want: []string{"a", "b", "d"}, - }, - { - name: "line comment", - in: `package p -import ( - "a" // comment - "b" // comment - - "c" -)`, - want: []string{"a", "c"}, - }, - { - name: "named import", - in: `package p -import ( - "a" - n "b" - - m "c" - "d" -)`, - want: []string{"a", "c"}, - }, - { - name: "blank import", - in: `package p -import ( - "a" - - _ "b" - - _ "c" - "d" -)`, - want: []string{"a", "b", "c"}, - }, - } { - t.Run(test.name, func(t *testing.T) { - fset := token.NewFileSet() - file, err := parser.ParseFile(fset, "test.go", strings.NewReader(test.in), parser.ParseComments) - if err != nil { - t.Fatal(err) - } - imps := findImportGroupStarts1(file.Imports) - got := make([]string, len(imps)) - for i, imp := range imps { - got[i], err = strconv.Unquote(imp.Path.Value) - if err != nil { - t.Fatal(err) - } - } - if !reflect.DeepEqual(got, test.want) { - t.Errorf("got %v, want %v", got, test.want) - } - }) - } - -} diff --git a/internal/backport/go/doc/example_test.go b/internal/backport/go/doc/example_test.go deleted file mode 100644 index ecb0bf848a..0000000000 --- a/internal/backport/go/doc/example_test.go +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc_test - -import ( - "bytes" - "fmt" - "path/filepath" - "reflect" - "strings" - "testing" - - "golang.org/x/tools/txtar" - "golang.org/x/website/internal/backport/diff" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/doc" - "golang.org/x/website/internal/backport/go/format" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -func TestExamples(t *testing.T) { - dir := filepath.Join("testdata", "examples") - filenames, err := filepath.Glob(filepath.Join(dir, "*.go")) - if err != nil { - t.Fatal(err) - } - for _, filename := range filenames { - t.Run(strings.TrimSuffix(filepath.Base(filename), ".go"), func(t *testing.T) { - fset := token.NewFileSet() - astFile, err := parser.ParseFile(fset, filename, nil, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - goldenFilename := strings.TrimSuffix(filename, ".go") + ".golden" - archive, err := txtar.ParseFile(goldenFilename) - if err != nil { - t.Fatal(err) - } - golden := map[string]string{} - for _, f := range archive.Files { - golden[f.Name] = strings.TrimSpace(string(f.Data)) - } - - // Collect the results of doc.Examples in a map keyed by example name. - examples := map[string]*doc.Example{} - for _, e := range doc.Examples(astFile) { - examples[e.Name] = e - // Treat missing sections in the golden as empty. - for _, kind := range []string{"Play", "Output"} { - key := e.Name + "." + kind - if _, ok := golden[key]; !ok { - golden[key] = "" - } - } - } - - // Each section in the golden file corresponds to an example we expect - // to see. - for sectionName, want := range golden { - name, kind, found := stringsCut(sectionName, ".") - if !found { - t.Fatalf("bad section name %q, want EXAMPLE_NAME.KIND", sectionName) - } - ex := examples[name] - if ex == nil { - t.Fatalf("no example named %q", name) - } - - var got string - switch kind { - case "Play": - got = strings.TrimSpace(formatFile(t, fset, ex.Play)) - - case "Output": - got = strings.TrimSpace(ex.Output) - default: - t.Fatalf("bad section kind %q", kind) - } - - if got != want { - t.Errorf("%s mismatch:\n%s", sectionName, - diff.Diff("want", []byte(want), "got", []byte(got))) - } - } - }) - } -} - -func formatFile(t *testing.T, fset *token.FileSet, n *ast.File) string { - t.Helper() - if n == nil { - return "" - } - var buf bytes.Buffer - if err := format.Node(&buf, fset, n); err != nil { - t.Fatal(err) - } - return buf.String() -} - -// This example illustrates how to use NewFromFiles -// to compute package documentation with examples. -func ExampleNewFromFiles() { - // src and test are two source files that make up - // a package whose documentation will be computed. - const src = ` -// This is the package comment. -package p - -import "fmt" - -// This comment is associated with the Greet function. -func Greet(who string) { - fmt.Printf("Hello, %s!\n", who) -} -` - const test = ` -package p_test - -// This comment is associated with the ExampleGreet_world example. -func ExampleGreet_world() { - Greet("world") -} -` - - // Create the AST by parsing src and test. - fset := token.NewFileSet() - files := []*ast.File{ - mustParse(fset, "src.go", src), - mustParse(fset, "src_test.go", test), - } - - // Compute package documentation with examples. - p, err := doc.NewFromFiles(fset, files, "example.com/p") - if err != nil { - panic(err) - } - - fmt.Printf("package %s - %s", p.Name, p.Doc) - fmt.Printf("func %s - %s", p.Funcs[0].Name, p.Funcs[0].Doc) - fmt.Printf(" ⤷ example with suffix %q - %s", p.Funcs[0].Examples[0].Suffix, p.Funcs[0].Examples[0].Doc) - - // Output: - // package p - This is the package comment. - // func Greet - This comment is associated with the Greet function. - // ⤷ example with suffix "world" - This comment is associated with the ExampleGreet_world example. -} - -func TestClassifyExamples(t *testing.T) { - const src = ` -package p - -const Const1 = 0 -var Var1 = 0 - -type ( - Type1 int - Type1_Foo int - Type1_foo int - type2 int - - Embed struct { Type1 } - Uembed struct { type2 } -) - -func Func1() {} -func Func1_Foo() {} -func Func1_foo() {} -func func2() {} - -func (Type1) Func1() {} -func (Type1) Func1_Foo() {} -func (Type1) Func1_foo() {} -func (Type1) func2() {} - -func (type2) Func1() {} - -type ( - Conflict int - Conflict_Conflict int - Conflict_conflict int -) - -func (Conflict) Conflict() {} - -func GFunc[T interface{}]() {} - -type GType[T interface{}] int - -func (GType[T]) M() {} -` - const test = ` -package p_test - -func ExampleConst1() {} // invalid - no support for consts and vars -func ExampleVar1() {} // invalid - no support for consts and vars - -func Example() {} -func Example_() {} // invalid - suffix must start with a lower-case letter -func Example_suffix() {} -func Example_suffix_xX_X_x() {} -func Example_世界() {} // invalid - suffix must start with a lower-case letter -func Example_123() {} // invalid - suffix must start with a lower-case letter -func Example_BadSuffix() {} // invalid - suffix must start with a lower-case letter - -func ExampleType1() {} -func ExampleType1_() {} // invalid - suffix must start with a lower-case letter -func ExampleType1_suffix() {} -func ExampleType1_BadSuffix() {} // invalid - suffix must start with a lower-case letter -func ExampleType1_Foo() {} -func ExampleType1_Foo_suffix() {} -func ExampleType1_Foo_BadSuffix() {} // invalid - suffix must start with a lower-case letter -func ExampleType1_foo() {} -func ExampleType1_foo_suffix() {} -func ExampleType1_foo_Suffix() {} // matches Type1, instead of Type1_foo -func Exampletype2() {} // invalid - cannot match unexported - -func ExampleFunc1() {} -func ExampleFunc1_() {} // invalid - suffix must start with a lower-case letter -func ExampleFunc1_suffix() {} -func ExampleFunc1_BadSuffix() {} // invalid - suffix must start with a lower-case letter -func ExampleFunc1_Foo() {} -func ExampleFunc1_Foo_suffix() {} -func ExampleFunc1_Foo_BadSuffix() {} // invalid - suffix must start with a lower-case letter -func ExampleFunc1_foo() {} -func ExampleFunc1_foo_suffix() {} -func ExampleFunc1_foo_Suffix() {} // matches Func1, instead of Func1_foo -func Examplefunc1() {} // invalid - cannot match unexported - -func ExampleType1_Func1() {} -func ExampleType1_Func1_() {} // invalid - suffix must start with a lower-case letter -func ExampleType1_Func1_suffix() {} -func ExampleType1_Func1_BadSuffix() {} // invalid - suffix must start with a lower-case letter -func ExampleType1_Func1_Foo() {} -func ExampleType1_Func1_Foo_suffix() {} -func ExampleType1_Func1_Foo_BadSuffix() {} // invalid - suffix must start with a lower-case letter -func ExampleType1_Func1_foo() {} -func ExampleType1_Func1_foo_suffix() {} -func ExampleType1_Func1_foo_Suffix() {} // matches Type1.Func1, instead of Type1.Func1_foo -func ExampleType1_func2() {} // matches Type1, instead of Type1.func2 - -func ExampleEmbed_Func1() {} // invalid - no support for forwarded methods from embedding exported type -func ExampleUembed_Func1() {} // methods from embedding unexported types are OK -func ExampleUembed_Func1_suffix() {} - -func ExampleConflict_Conflict() {} // ambiguous with either Conflict or Conflict_Conflict type -func ExampleConflict_conflict() {} // ambiguous with either Conflict or Conflict_conflict type -func ExampleConflict_Conflict_suffix() {} // ambiguous with either Conflict or Conflict_Conflict type -func ExampleConflict_conflict_suffix() {} // ambiguous with either Conflict or Conflict_conflict type - -func ExampleGFunc() {} -func ExampleGFunc_suffix() {} - -func ExampleGType_M() {} -func ExampleGType_M_suffix() {} -` - - // Parse literal source code as a *doc.Package. - fset := token.NewFileSet() - files := []*ast.File{ - mustParse(fset, "src.go", src), - mustParse(fset, "src_test.go", test), - } - p, err := doc.NewFromFiles(fset, files, "example.com/p") - if err != nil { - t.Fatalf("doc.NewFromFiles: %v", err) - } - - // Collect the association of examples to top-level identifiers. - got := map[string][]string{} - got[""] = exampleNames(p.Examples) - for _, f := range p.Funcs { - got[f.Name] = exampleNames(f.Examples) - } - for _, t := range p.Types { - got[t.Name] = exampleNames(t.Examples) - for _, f := range t.Funcs { - got[f.Name] = exampleNames(f.Examples) - } - for _, m := range t.Methods { - got[t.Name+"."+m.Name] = exampleNames(m.Examples) - } - } - - want := map[string][]string{ - "": {"", "suffix", "suffix_xX_X_x"}, // Package-level examples. - - "Type1": {"", "foo_Suffix", "func2", "suffix"}, - "Type1_Foo": {"", "suffix"}, - "Type1_foo": {"", "suffix"}, - - "Func1": {"", "foo_Suffix", "suffix"}, - "Func1_Foo": {"", "suffix"}, - "Func1_foo": {"", "suffix"}, - - "Type1.Func1": {"", "foo_Suffix", "suffix"}, - "Type1.Func1_Foo": {"", "suffix"}, - "Type1.Func1_foo": {"", "suffix"}, - - "Uembed.Func1": {"", "suffix"}, - - // These are implementation dependent due to the ambiguous parsing. - "Conflict_Conflict": {"", "suffix"}, - "Conflict_conflict": {"", "suffix"}, - - "GFunc": {"", "suffix"}, - "GType.M": {"", "suffix"}, - } - - for id := range got { - if !reflect.DeepEqual(got[id], want[id]) { - t.Errorf("classification mismatch for %q:\ngot %q\nwant %q", id, got[id], want[id]) - } - delete(want, id) - } - if len(want) > 0 { - t.Errorf("did not find:\n%q", want) - } -} - -func exampleNames(exs []*doc.Example) (out []string) { - for _, ex := range exs { - out = append(out, ex.Suffix) - } - return out -} - -func mustParse(fset *token.FileSet, filename, src string) *ast.File { - f, err := parser.ParseFile(fset, filename, src, parser.ParseComments) - if err != nil { - panic(err) - } - return f -} - -func stringsCut(s, sep string) (before, after string, found bool) { - if i := strings.Index(s, sep); i >= 0 { - return s[:i], s[i+len(sep):], true - } - return s, "", false -} diff --git a/internal/backport/go/doc/exports.go b/internal/backport/go/doc/exports.go deleted file mode 100644 index c2b91d5f8f..0000000000 --- a/internal/backport/go/doc/exports.go +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements export filtering of an AST. - -package doc - -import ( - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" -) - -// filterIdentList removes unexported names from list in place -// and returns the resulting list. -func filterIdentList(list []*ast.Ident) []*ast.Ident { - j := 0 - for _, x := range list { - if token.IsExported(x.Name) { - list[j] = x - j++ - } - } - return list[0:j] -} - -var underscore = ast.NewIdent("_") - -func filterCompositeLit(lit *ast.CompositeLit, filter Filter, export bool) { - n := len(lit.Elts) - lit.Elts = filterExprList(lit.Elts, filter, export) - if len(lit.Elts) < n { - lit.Incomplete = true - } -} - -func filterExprList(list []ast.Expr, filter Filter, export bool) []ast.Expr { - j := 0 - for _, exp := range list { - switch x := exp.(type) { - case *ast.CompositeLit: - filterCompositeLit(x, filter, export) - case *ast.KeyValueExpr: - if x, ok := x.Key.(*ast.Ident); ok && !filter(x.Name) { - continue - } - if x, ok := x.Value.(*ast.CompositeLit); ok { - filterCompositeLit(x, filter, export) - } - } - list[j] = exp - j++ - } - return list[0:j] -} - -// updateIdentList replaces all unexported identifiers with underscore -// and reports whether at least one exported name exists. -func updateIdentList(list []*ast.Ident) (hasExported bool) { - for i, x := range list { - if token.IsExported(x.Name) { - hasExported = true - } else { - list[i] = underscore - } - } - return hasExported -} - -// hasExportedName reports whether list contains any exported names. -func hasExportedName(list []*ast.Ident) bool { - for _, x := range list { - if x.IsExported() { - return true - } - } - return false -} - -// removeAnonymousField removes anonymous fields named name from an interface. -func removeAnonymousField(name string, ityp *ast.InterfaceType) { - list := ityp.Methods.List // we know that ityp.Methods != nil - j := 0 - for _, field := range list { - keepField := true - if n := len(field.Names); n == 0 { - // anonymous field - if fname, _ := baseTypeName(field.Type); fname == name { - keepField = false - } - } - if keepField { - list[j] = field - j++ - } - } - if j < len(list) { - ityp.Incomplete = true - } - ityp.Methods.List = list[0:j] -} - -// filterFieldList removes unexported fields (field names) from the field list -// in place and reports whether fields were removed. Anonymous fields are -// recorded with the parent type. filterType is called with the types of -// all remaining fields. -func (r *reader) filterFieldList(parent *namedType, fields *ast.FieldList, ityp *ast.InterfaceType) (removedFields bool) { - if fields == nil { - return - } - list := fields.List - j := 0 - for _, field := range list { - keepField := false - if n := len(field.Names); n == 0 { - // anonymous field or embedded type or union element - fname := r.recordAnonymousField(parent, field.Type) - if fname != "" { - if token.IsExported(fname) { - keepField = true - } else if ityp != nil && predeclaredTypes[fname] { - // possibly an embedded predeclared type; keep it for now but - // remember this interface so that it can be fixed if name is also - // defined locally - keepField = true - r.remember(fname, ityp) - } - } else { - // If we're operating on an interface, assume that this is an embedded - // type or union element. - // - // TODO(rfindley): consider traversing into approximation/unions - // elements to see if they are entirely unexported. - keepField = ityp != nil - } - } else { - field.Names = filterIdentList(field.Names) - if len(field.Names) < n { - removedFields = true - } - if len(field.Names) > 0 { - keepField = true - } - } - if keepField { - r.filterType(nil, field.Type) - list[j] = field - j++ - } - } - if j < len(list) { - removedFields = true - } - fields.List = list[0:j] - return -} - -// filterParamList applies filterType to each parameter type in fields. -func (r *reader) filterParamList(fields *ast.FieldList) { - if fields != nil { - for _, f := range fields.List { - r.filterType(nil, f.Type) - } - } -} - -// filterType strips any unexported struct fields or method types from typ -// in place. If fields (or methods) have been removed, the corresponding -// struct or interface type has the Incomplete field set to true. -func (r *reader) filterType(parent *namedType, typ ast.Expr) { - switch t := typ.(type) { - case *ast.Ident: - // nothing to do - case *ast.ParenExpr: - r.filterType(nil, t.X) - case *ast.StarExpr: // possibly an embedded type literal - r.filterType(nil, t.X) - case *ast.UnaryExpr: - if t.Op == token.TILDE { // approximation element - r.filterType(nil, t.X) - } - case *ast.BinaryExpr: - if t.Op == token.OR { // union - r.filterType(nil, t.X) - r.filterType(nil, t.Y) - } - case *ast.ArrayType: - r.filterType(nil, t.Elt) - case *ast.StructType: - if r.filterFieldList(parent, t.Fields, nil) { - t.Incomplete = true - } - case *ast.FuncType: - r.filterParamList(t.TypeParams) - r.filterParamList(t.Params) - r.filterParamList(t.Results) - case *ast.InterfaceType: - if r.filterFieldList(parent, t.Methods, t) { - t.Incomplete = true - } - case *ast.MapType: - r.filterType(nil, t.Key) - r.filterType(nil, t.Value) - case *ast.ChanType: - r.filterType(nil, t.Value) - } -} - -func (r *reader) filterSpec(spec ast.Spec) bool { - switch s := spec.(type) { - case *ast.ImportSpec: - // always keep imports so we can collect them - return true - case *ast.ValueSpec: - s.Values = filterExprList(s.Values, token.IsExported, true) - if len(s.Values) > 0 || s.Type == nil && len(s.Values) == 0 { - // If there are values declared on RHS, just replace the unexported - // identifiers on the LHS with underscore, so that it matches - // the sequence of expression on the RHS. - // - // Similarly, if there are no type and values, then this expression - // must be following an iota expression, where order matters. - if updateIdentList(s.Names) { - r.filterType(nil, s.Type) - return true - } - } else { - s.Names = filterIdentList(s.Names) - if len(s.Names) > 0 { - r.filterType(nil, s.Type) - return true - } - } - case *ast.TypeSpec: - // Don't filter type parameters here, by analogy with function parameters - // which are not filtered for top-level function declarations. - if name := s.Name.Name; token.IsExported(name) { - r.filterType(r.lookupType(s.Name.Name), s.Type) - return true - } else if IsPredeclared(name) { - if r.shadowedPredecl == nil { - r.shadowedPredecl = make(map[string]bool) - } - r.shadowedPredecl[name] = true - } - } - return false -} - -// copyConstType returns a copy of typ with position pos. -// typ must be a valid constant type. -// In practice, only (possibly qualified) identifiers are possible. -func copyConstType(typ ast.Expr, pos token.Pos) ast.Expr { - switch typ := typ.(type) { - case *ast.Ident: - return &ast.Ident{Name: typ.Name, NamePos: pos} - case *ast.SelectorExpr: - if id, ok := typ.X.(*ast.Ident); ok { - // presumably a qualified identifier - return &ast.SelectorExpr{ - Sel: ast.NewIdent(typ.Sel.Name), - X: &ast.Ident{Name: id.Name, NamePos: pos}, - } - } - } - return nil // shouldn't happen, but be conservative and don't panic -} - -func (r *reader) filterSpecList(list []ast.Spec, tok token.Token) []ast.Spec { - if tok == token.CONST { - // Propagate any type information that would get lost otherwise - // when unexported constants are filtered. - var prevType ast.Expr - for _, spec := range list { - spec := spec.(*ast.ValueSpec) - if spec.Type == nil && len(spec.Values) == 0 && prevType != nil { - // provide current spec with an explicit type - spec.Type = copyConstType(prevType, spec.Pos()) - } - if hasExportedName(spec.Names) { - // exported names are preserved so there's no need to propagate the type - prevType = nil - } else { - prevType = spec.Type - } - } - } - - j := 0 - for _, s := range list { - if r.filterSpec(s) { - list[j] = s - j++ - } - } - return list[0:j] -} - -func (r *reader) filterDecl(decl ast.Decl) bool { - switch d := decl.(type) { - case *ast.GenDecl: - d.Specs = r.filterSpecList(d.Specs, d.Tok) - return len(d.Specs) > 0 - case *ast.FuncDecl: - // ok to filter these methods early because any - // conflicting method will be filtered here, too - - // thus, removing these methods early will not lead - // to the false removal of possible conflicts - return token.IsExported(d.Name.Name) - } - return false -} - -// fileExports removes unexported declarations from src in place. -func (r *reader) fileExports(src *ast.File) { - j := 0 - for _, d := range src.Decls { - if r.filterDecl(d) { - src.Decls[j] = d - j++ - } - } - src.Decls = src.Decls[0:j] -} diff --git a/internal/backport/go/doc/filter.go b/internal/backport/go/doc/filter.go deleted file mode 100644 index ddf0368692..0000000000 --- a/internal/backport/go/doc/filter.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import "golang.org/x/website/internal/backport/go/ast" - -type Filter func(string) bool - -func matchFields(fields *ast.FieldList, f Filter) bool { - if fields != nil { - for _, field := range fields.List { - for _, name := range field.Names { - if f(name.Name) { - return true - } - } - } - } - return false -} - -func matchDecl(d *ast.GenDecl, f Filter) bool { - for _, d := range d.Specs { - switch v := d.(type) { - case *ast.ValueSpec: - for _, name := range v.Names { - if f(name.Name) { - return true - } - } - case *ast.TypeSpec: - if f(v.Name.Name) { - return true - } - // We don't match ordinary parameters in filterFuncs, so by analogy don't - // match type parameters here. - switch t := v.Type.(type) { - case *ast.StructType: - if matchFields(t.Fields, f) { - return true - } - case *ast.InterfaceType: - if matchFields(t.Methods, f) { - return true - } - } - } - } - return false -} - -func filterValues(a []*Value, f Filter) []*Value { - w := 0 - for _, vd := range a { - if matchDecl(vd.Decl, f) { - a[w] = vd - w++ - } - } - return a[0:w] -} - -func filterFuncs(a []*Func, f Filter) []*Func { - w := 0 - for _, fd := range a { - if f(fd.Name) { - a[w] = fd - w++ - } - } - return a[0:w] -} - -func filterTypes(a []*Type, f Filter) []*Type { - w := 0 - for _, td := range a { - n := 0 // number of matches - if matchDecl(td.Decl, f) { - n = 1 - } else { - // type name doesn't match, but we may have matching consts, vars, factories or methods - td.Consts = filterValues(td.Consts, f) - td.Vars = filterValues(td.Vars, f) - td.Funcs = filterFuncs(td.Funcs, f) - td.Methods = filterFuncs(td.Methods, f) - n += len(td.Consts) + len(td.Vars) + len(td.Funcs) + len(td.Methods) - } - if n > 0 { - a[w] = td - w++ - } - } - return a[0:w] -} - -// Filter eliminates documentation for names that don't pass through the filter f. -// TODO(gri): Recognize "Type.Method" as a name. -func (p *Package) Filter(f Filter) { - p.Consts = filterValues(p.Consts, f) - p.Vars = filterValues(p.Vars, f) - p.Types = filterTypes(p.Types, f) - p.Funcs = filterFuncs(p.Funcs, f) - p.Doc = "" // don't show top-level package doc -} diff --git a/internal/backport/go/doc/headscan b/internal/backport/go/doc/headscan deleted file mode 100755 index 1c20463268daa018ffaed5dd9a63c2565953f6c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2913680 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

1tcf1l_ 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

K~KHL(Ou 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 |1E9I<^c!_1o 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

j1GT^z2`7)X9F&u&k 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

~C1# zhtDKysdszm%TrO(Kf&JVVG7WOHZBAEI?9DLQn}wmiT-PdSJ$E3N8o+pf5L|VdlfRosQLtJs10B&iM1iv zA>R9V7J5j*ej1qYFYr#4`&(b`n^Wbc=;T-OnM}Ydm3s=<#T;#=%Dn_^Kd`r?U>^n6 z0v2#Xxc&^V(KRQB)#oRGXy+N`=^Xi?+W&V+cTM;fL2wH zU{%h-cj0r8zgp9Myd(TO?#l`G9$@e1g@Uh7FyW_QUr3dEfp&$HA5E3}w;uMxoYk)0 zeVD$e-0%5vlfXuR-Ct+ze0_o`E+G5^ou^zK6*#;wsn3mSgFzblw@0Kqm>Fy(4|h`Ij-4|^x)8yxST zP#8xq_n)F};c37tt?jRIh(GI3eG%Qg#6Y`WOx_jj8-NW0V=Cfu@3}>}Z@Wdg?*lds z;rIA=MQ?vhU({#eiP{zH?}2Rx5yN;zThbN8C&M@dTVuSU%TP|ZuIGZC=B)bkM|GJ& zXcZRF2Kx?#&Fi zm*Zr85iImY^H`;VANr1juk8eOnBy0Lg?SOb`Z&i^-<8N!$jA8TXMyeGTH_T=dg8zM z=SiQL4x>5Mr}B@lfXj%G!BIu|MPceGId{0u)$lv@EFoaGS9lT-JrlA;dov? z%=P<$1v#T~Kf48{xhinH2ZihBIjetyUH7mVM?;mha=90s;1lhaF6ndoS0Y zq1=25_7M;JJ<5l7AEcg#Y4?V&57Ntgk#gJqWujjRCfX8AbfCsj#|yk0c)MV7ng23_*qbW1_ZF}v2KYTcn#tr-<$je4w!ZsGU}_`uMQ!YX zNVb-H1BkBr((OJ5jqBaeXNG0*@G&o~6r`e|(X6TJH;oi3e*MJbr@Mfg7T zawhXEXO*MLj2sbbz>av>n>f#USXfKJ{>sBbyMhTP^==xbM2)TW$!{gtg;X26nNz{i zZLBh3Tg$!I!%n8&{caCSxBKfJb}m(JjJa2Ruv8nb`h3*G!gw{$zs5fcFo3r*9?gsJ z`5BJS{8Ylj1e5*omz0xjta3DI^Y+a@m+1F`J<1&XQ~1?CaGhR{cTz6$Fp8KCuW|uj zv_^Mw2sZBf!mX|EH^GF0T+q8JC*Il5S#1dRX^t2E*Q7qC-DJ+EexaS$HG%)ijl_<+ zkNZbx@3D_EMy^$#U>~AVmAmX=k8plF$0p?hUF!S=jvXI!a#HUK_5tcspY<1DKLKom za)0Gv>hp&<{=>he|9-qoZH6Iaa=`X;*1LkyWaht5!6zT}%6zt6mMzAn{T|E0+U_bir z6Z;pCt>vFl-(LT&#_@F=AO8gZ@TdL>_KghsPd=IW(gc%TE8KW4RZfL}lZBTa8Qv95 z|F=)MwF={f3^I@YRwnaHJPWX&1y%y~pnq56{SUW*ecr>y7*BY2fO_=qXHxIJ&BN4w zDE9^`{j1+*4pZgoz@Gh`Os0~8eG&ru^zVYtsWv_jOl`D$IUZ$R;P~TTO>j-HH_=`i z2FT{{1JOeb=8Pd`RzpJ22toy{UJ91lXN_gx#8g z{icVd@&0k@{xpkxI8`p9()a&aq672D=H=gfHqi+K>^D;|s?U4}|NJY6<7YUl&*Fb~ zaR^Vv2Lw~OUXDNh3+E#ijHNZcAvqm*wqSD<{@%Yz`lol_;NN{KXT8hR8o&C5ze#8x zkhOF9uWy!v$5SxXx4?1iza%~s!QResVGHa>fN7rhat`AVeLVViiQLk=bR+X!z`}Y6 z_QhMkzRZKIy~_fth^&AJ)}<>pH1>KCQNf12D`4-~yDs)F z_7V&B9!rdxL}Nk49%~X4dyPho8l%R7|L2)GpS@@Amqh=s*KhRfIrH52=kz&qX6DR* zty`oq8wE6toGl9b+7k*}=oXs=^IFaLhGe>xV2$Zs4>OH9Gu;h|cVokSziautoJqd_r=*ycT76jDE?f}iNb4H zZF|7h#qGt!e>41G#}R%IHczH|1NIA6aXy~no1J}!T-pBk+RDaavrV^ZWk9l(okRFq z*dH_7-@>-;TJ5+8s_x5V>-jL^o0CFs+r8Rx4^N%#CVLuR9cIP-+LIX+7EZP@iopB+ z)#92hbeF>xM*Cy8C9qo=NP{Oy`{6baPw#X(RJKi0uB%c0gheX6&HEp2*m7vtSRvj^?4o9+~cg zqI&8m7EYDvL24Cyt z-Ap$Q_BF@gWf|Kn=^o421&QVP`#Q0EGu;BrpG||Iydy71C-z{*&X@(eC9%BSzJfV! zIEF^Q@|zW=k@vOXiM^NUcAW)#c^0-G%tE&U*I=fR_qF2^%hR|iu>-Pn=j0&PHs&vM z<;voT<$2ydvHZ9^BC$w=L$bIh=a~37VY*Xs{=|E0p<-k#|&xSC}BL2FCDmU&v- z*S36gTs{P*xr#9ikInC9v=rxK$4TyFu%5vc4LzFGIi8zZcgDZLgk%)8GNxLs)OeCx zORTh=qcVlmET_79UV4+8xm^mJ(slh?mtsAT8uhx^I`SL)JmINtL$ryS8q|r?zaP-qcEK(MD=nBH~|6OHJNxT6BK) z9xD(!ujkF4=oe)v;x$8VMI>bzt?#r(D0wAM`6ylmiuZx6le*rzZt~KW{KUH8NYzyX z5uGNKGW|k(daA;i5P+g=tqMCCp24WNWv@fJK zZE5Ya)x`%~xT8hjS_7xy@wOId%u&l?-N#T={bWA4>A<6$^pE7$ULWi?Ng29cNj z|C?U_>1Dq(=8{LB9f+#6m|>UPNgX7X%{5MarHmY;Ex{_vDE=y6yQyfY~&$aW` zdC{9YI<)bW<4?7@OLLX6Yf85%9B7^6=T(X<{(65dyMNiAJFm4Y`UE|~IwI=0C^Q;dn`9v550^Fp)#^)BiQX_0Q(huU{*uN_;vvUXAJzFK=teSIACnCU~m zXe|~ymVLKJ8f*I(IgR`qC$A0R=HMECr6T@v%pN%Jz}BIygIia`@tGZTWx2}pSqo!) zG0JzO+d}+ZC`-OZP z>gLt$tFBcsPVY0am4gC-h09w5#cwGuphdV4;fKYzFk;iLuYvNADgslQibnt)-wI4e zWLi{MR+{k{0WR-%1xsg$)ZZQV<49oCX1!W{z3I&U%`<)LQ`&(R%=>(RMXH=sW6%S_^!o>Fy2c)el5COQJ=+eT6C;5?a7Aydfvu% z&fWK9j`Xejvb`&;Tb|avz5A5zr*(g-`$^r8HRDsbDOLxwQ-3!0` zy*x9wbBsMwIh`kQCu8?j<%`Pk$-ex(x=gigVB1n{i?%J`&UXFn+6uPJs^67ll5vaUJZ%w4Jx(LbHii6AYmHBV) za&ni4yG-mdv8lOI^Y^0P)@MgEZSEgtZrL)SWw+v3Ni|g3mwBi()w)b>8sFu)rtwW1 zlbMa0wrtw8$@tUneQJFweOmjp^l9tUT!gEAn)>*AS;p#f)%H>CW7~IcKcfAZ_G6|T z(|+NUYP-MJ$G$GL(`qNx9<7b4&BcF9F#`H~dEC`lx3W%kljkG#5B{#J zRBBD5ng&+pYHH)T^O&ZwkkL(}v)}#RSZk#Xs~V#f?b2j7a@?9<^Kx^kM+?E0b{sz! z=dEE*wAI$Av>n-Y)V)WIJnY(|2JYQ<5Y^7&AP=+{AMGbmI%~HXX9bx~jGI?6 z@bb2Dm9_5=HB~=ss-E3c{SEg7`M=QhM$6V-;fVB#*%bq(4Wu54!oO(Cx8xW4Cey&O94$Fyr<+ExrY<8?RUZ5LMQfk zF)y;+aOQ7t#;zu;&MkD;5>_`NG5gDWxIO5AVJq`kKN>a~Ut8H~ICcFSn7Uxr!P_{? zW}Rs(`!ca8n{Bla`M8424@x@O%CLiBlQZ@<-EKBAux`fQhq=ajY-0WJeGlSxCQ9bT zO*RrX0~Tp`9-Tzr8P379J7M!D^FF)lhR@HKH$U2F%TF@qjT6~>iFr)kiF0lD2N`>e z@CUHVQa>%8&A@J@V)scpnKtvmPEO2vui?7Tajg%xHr$F#W)^})8>t(ITOYOnzU7c@ zg>${~(uuX#+T4E)edN9Q{3B{Eyr$;iBq zuWm8)w&8$9E0t&P-DDmgOTb>n58X4^4CKe{GxiS5{&#L-!||u$o~3ek%-Gq4kEG&H zNNgy+W7kOX67A+Ovn0;rV`S3VH}9idwvm0uyvQC(Y`?@7$KL>FULpe=_*P|blv4zOX$4l@WC}XQ6HYH=nI}Tr+ZBO$QYuQI-%(ioV`@V@y#DAHw#PyxgZnD27 z7U?bvGi*7Q$9FS-QH~V|o31*`WI1eCx4axQU5C!HJu?oiBDOsNxrQ*f>{vgUthru|)QMpEA#RU3~!a{F|5K12X2?-}SRJWUfig*$e&3 zbQjEYFTzZBa>nN31mt;tV8*(@TnB%AV)muyalhQIzQ$VSnhw|QPo|x%7yH+)wB;H* zv&MpOu-#x=z#_ig`RxGQHL$_N;kGpHK%D(*5tz0N1I7C;&KWKv9LzEGIc)o8x*ZbR zDbr0P{5`tU6PpwNHr$50l=D{Oll?j|^B^0Be?Db;V~?^e*)5pqeFGbs>0U-BGoG-0 z17@D7t`2rI`&&~fgBqCY+jDj?x=YcuWjdLXa9_{%|To4f^LnB^-b)O#FoPUJ@L8L{t)UyTiI1G=c1?M%SORg;CJ&J z$5yb9=IG3xMf1$q`thdjWti_39Y#3fTa3IoPI^8FwhGL5eh$jmvR%tMJwIbBCuX12 z*7MOfgoiTdeVlZ*^JsLQ8#hS0k+9cru7mHNbh7soyDBm3aWe*d-w&{Fn}+O2nDr9# zHL9ez{y5~kvJTj-P}Iuf{LuZ}`gqDPRm>?|W5{7$#3y?d=X&p0AHm^W99ypUZX;~E zvZHYWF09YjWb9TNb<>j0GKH=6u{&b*!Dc3QaH<#MbBu6J`KU~{6inOW6JxisD1R3E zC2Ku0wm9qvI@Pino0xP_&)V*obXR7&g$VzF_?EzTV`whscu&J>gw33!vpE9%FL>?+*puw(Fz&$?QHJZwLW{L%4(je)ry z{e{HXE#9SVtb@7Xvg7czRcAWgudE-xGLI$MKKSaagBpLHySjefmyJs7g-o|5dD!Wi z@;C<4`-Q_dZ8|M0PhKUZ{=grKiiPZk*W_)LmZZFauMcDY< z$U>2>W0G5*?#}Gzx&?2j&tJ^*W5nlL_63t}F8uXyuB}}yV;d3v1h#Ktrs;LcUUyY0 zwTwLtI|AmhWx9?z9y4$MhIb}2=6GR0XhyG&YA@dB`~lrMgxzGf<9gp+zb2MFhs{sv zkQC>-Nxv)m6}v?}Ird+}m^c>Sbk%vx{2bjHKSO8!hU2Wi1@NP6_NTu0)z`AC8-rUP zW?tN6p09Svbaa7YyzhB`dCoCD*$zoJ1wYtMG`wvT?WS%I*y9f{UQkeVw#N~;Egve! zk6^~LC+tmpndkV8aTh;aKaONI+zqfz@zvQkIqei{%C{g5H+5g(UO+drsnjjZejCoU z=Z@oUpa!1{;!?ZFB~1uNmbrNU%8GR>40Kwl%(aQFkM@3&3{E*sox&gP#vS zbPp50=kfZxjM_e!7^me9o$EW-da|5ngNrmgFARfm$aUzZqce@X|2>-6)J*rpEObxJ zLU(R+S&lgWBB`8}Se)a#!Ja2C`FJmTA+h69y6hJBw_M|I-?0v4`{8zleUw;te2)v) z?=~S&CvzOS^v3`B2?lRm+*hN`<56nXM zP|__!=ZQQY1iSLN@^~j$oC6#`m%fx^E5(ObSrMCepRc#CY~{p`A{_B;kXT+X8^RXh z$22gj48-Ob`q~zR-Dbl%CfX;r#1Gvy zgkOJ?vi$^mh~Im?Rlj#=8kiMqCcg2Rml?PL?^Y@k6tIzvqMS>@)`o>{U4C$W>M`xs z2R8-h{50}se1AZ9BNf}1u-n|Yd5LFhbVCS7d|s=q{XwPj?*_JI#>~s2xLf~T-g_cg z8v^XE6n!r8po|CF52T$SfsHn;mtp*&pS<5W*ga-p_>3Zyg?_k-E!T2)YbZ*m+!!0 zUXi*(YOdt?|vy{!sGb+Wmu*PBt9oy8vzYp&Or= z@dn!+b{4jaP-nrM$NE0W-kGiE7vCp2C1b6W<8s#hw`K9oih2DpTT9jNcz2}X*yK9{ zTcmXPsd#2`H#!cHLMOA&dJe56TiJQID?cR8j7@|2-j44dTMnWv<}!yf(Q6~@Mv|35 z{BA!TK{#|@z+C@)PsV&d-Zk`etq$D*M4*mCq=Ov{Q@0}eh;MM$QumikSA$*BTCHrF z%4_}}NxH8x-BU38)kax-mv%4XW7^e`#?`Q|cyGe*z(l&swv@W}GTrJhb!TKc?+wqx z#kcc`u-!DV$1`>r%<|^(T>~?|)w1{w=Y;X#g4N2j%vSb71N$4SF}{yr*5BY%FCII4 z;Z_}3?YLhe+Xv^d71u{H=hCOq`PU%qCfgDBEq!P-zGWku#r)a+k{?@3z-60fx`~9R z)2ZUzqpk7D7V-qcM)8ZWoh#YuY`v#-a)luMsq4yfohP7X+*n*!Tz8zCx&@0+Ip0{J z@_mWv=?)}6U(2=H52`k zwtP}hJhwcyP(4V_xlAa}pyhEgrPTi9U+cGbsjAkx6l)Zk_zG)}O4EFmCjR{?{_jz3 zI<3;QX9XVhM0$5_S(%2r9d|G8KHML058&LK7dx(%n|tNlHq~6EYxzU*w-0|?i;y+v z%AwXlwYJ*QwGp);Lux~~hPtkD4QIsWDa})=6wGlq)mxQSz}1$ysxAC`_k5U@|Jmh# z0zIlNW2!9!sx7&Gd|w`nw2ZIy+_Kh_z^0X!TBT*9TFoZ=Xft<;q*DB}l&-{p}*jjtCJgL%; z?=ZHs^WF%{B3oPLZ*AGOwPjCuYfG)QWmEn~Q1(6RZhRLK@jnvl{NMj2{%%5Z;X3tm zI{6}%rh)Y8=BA#NrU8|vxhky4Y8qufZ<@`2eyXWQ*QO~{OpG~u5Qoof2jK^sOxQNQ zD`STy_Gw~k;Qto)H(K-GXtfRIz5kruj!t%XQ$3CC2>Y#<V5T2=X=H2h z+plnKG=%+Ao$NN8X~ea&>~5U8P4LxO-_AvSHuh1*PABX$Ii^1yx{H!7o=4fX{mGlp ztanH{*#OuYG{UZgEdza{XcN~n>`T~m)jfdD=L<2m%RH~j;@V2~IP7C=y{^&L@o{w` zb{)#NjQLFj^RhF{OvU?yUWfV3$D1>@DVkAqP|Q1QH&1Lp#$0=4d{MT6{B|YIzOi1?$*xPx zwlaUR891Mt#y7<*qt8cXCt$yFbG#mbb6v&~0yf!_xRqcd@r`d`{6A7Bi_#d5-NC#s zE_*a%K37{4<{V9(@t=fqeZ;0oC%YV{?%a(1IkDl%*1Wuf8&G53iti>{2Isnm3j}Pz zEQic=m&PyB<|G!!f^1owYhsqmbSo3~yLn$^>`wA6a2 zy30ECd*;Jn-%v01tE~vT$$m)e4}^`+JWV7%*9%0RWj^n*EiHHG_JX;F;Hr$BMqlxH z@}P`e1p9pbN+s^e7~f4Wznk}brhAd&zA;_jTQm)d*OBfkiA5hbzF+kyzgM+mrn>|7 z#fIg1G4gyT>~8GO%yhf!!XxJ+?#Ce{~outuVbT|jP6*p(UJJ38#>!pooogC6L9?|mB(T*`}k1UA2Zz< zgh#=A9u~TH3H!ad8#CRPFuyH#UZ(RLq3(*r=0yKGu6>vKeKXmgajvEN9^W)%f5EBa zl-9vMhV9d>92*E0b#_Tpxi)GL`(gVfVQnAG*be9%hbT&iZbz8?+2c5DcY*mV+Vq1R z-dy%w4$Thc`_3y3D`&5vI~%6$(@DqSUGaWc{_Q~7o-o(@tVfvQbz1L3H!spqw?8`9 zwG1Hawi#{`&UH)k;+w9z1JT*XhiB||%9Wpw)cqEA-v0IeEc;zzhi10km&%VLb$^A~ z|5nR%ufa@r-;5nV9W>hdzIdbUp|IR`6mi^ZUbe2^E3zjE*k3R&(x4eCSKxeZ zzhTC1O)QQNb-zw*3F5HbjPqdJ#+TH~COZu0^Yg{=L+7#Vch%O&n0+z7r?0Ixvg0z{ zvHT#5x}w@E#kk82_6I17X~=d*w;XIT%($qM;@g!z+rBvI=-QRZ{P-vb%tC~Did{@IplNaX#=9k^d1l$>4KXt!F=QqF}&zNg=eva*EblUzU zv)!A6R|M}<@_${el^&yVBV*+J~1nLMb}0+7(-;`PMGJW zV22WZ81~D=`r|v^n#S@OdxfyivEx`6#(oXwbL<)T#y1jw2=3JB<-Iq8#eJ8t_!q#g z#}D0dgs*~eTd-h`L%ng<)uoA94zf|OvzkiXD(sstbt`l!89x=rqu)#0ldx&XcGSVR z-PggkP3%t@vkrXLo7*0g*y5RPpTyqD*k^=iqXJgvw@BA}fj+bL8>PYgrjB`eAThFD z8G@~ANfsyUW?zf7Btr>n8@ltD5ULB-j@WfA_BFSzxLDURjd19k`_C{$7KgGE%=3oKxm>U_3BU2@`aO7UXT>h$2W_KYQQgJ&<$YG^dCqM%+z~jR zRkp)SL*2rJU1u~pF^@s#6#d`knhRf@Y^B6v?kF3L^ZRT6z*lEdYv9iOu$(gxEZ$3V zji&dIcV$1<{hxcyMBwwcjWXR*u-|=LpC6cp&k$r&@Qu&@au4C>KP&HvvsV9CYcwp z&(1yg)?{ni9@9f$%O*zFif`%l;CaQ`giS+sq&k@6Le5reVDIz0&nEWHbTn=8tf+66 z#y2p(Yc-C@Bfi}^V72`!v-Q5z1#?y_|L$Jb{TAl4jtLoihe~XGCh~XK$N|-2J*{Q6 z9IwOHgI%2RG6#(AT|85YIkoIk+(iScy!}|FE4v1F9qgfGYn-ESL%3PeAK!Aw*1#|b4Th3cA%Ro7g&x>j3t^R{Z=O0{-er8c2bd$=;{;mX*DE9=xM zl?N-e_DYRFvCYk2U9r*UyVZz`^qL44TYJ|^d-wJU%~K~gPd&7G>XFS;cWa(Hq1)66 z&8;>5t<>f@_|yb?w^p2UZ8ztCMPoIU_u{Mgv*EfNJF`oZ&iyXmcR2-rEN&pKb#@%S zWt!JW+}dkhD(z$kHvwn3?RfkX**~wjX)@v3dF)T+emuV&Kc&)i0IT`g2^$E95oAFz5HC(%#jBt~?;~v2JFzd@}=P2uD><`8H&X4VBA5u3D&TD7; ziq)ZR63%PqC}O zdwA<-Y)6>y&D#G%ckR!N@8(&=Co{f0jq_6b&Z<8zoTYndYTwmiMANCfwM=(wiqF2` zmiL!DzS~lKW6(6lw-zkQJDU2mJq8;YTOQva_Cq%YjqOo`HO4n8)A^wuJrn@-)!8rS59ILWJ zW;-(f9v2kmUk@7G}Jwa z`)~2J@muJo6E;5kT4Q{cP2JM?)`8F8cF5Q(iG7fg*98%;oGd2Nrz^6rx9Hl+;4=ls(xk8d0HBfhQC8Q*!Z z#`w<9bpPT)&-mtsx#jWoWk2Hk2A%PF9&C(n?M(M_uQI;>HC|aSe?w<{rq>wX=2?7P zC>Htqsrb5~GrkpO5#Negd{tHJwU7=GQSkIxm7M=gL-L8o(kH0a_ zXUy~ByU9FEN3eZM~m3d`Ip>;mha(l^e+X z)>ObhlTPM0wPmh}2;FqT?+@c1K*pXY++#TRBNOB2$}s9_DGs*PQ+zW24Kkk-$GJx~ z9_D%<*R+|2Y=dO`yOclY>fgd_%m3A1)XmAYwRL(SVWKSBd=kEOdJ(>9jKb#%zgXvC z-w3ug%zwYkdzNnICDwlIP>_=ieq;U~ zg&7~&D9(S6Os!uFshvT--hyqB>BbUP=dq@P+_gQu1KU0d0*u;0Tb5)QU%(#82h zo!7P6x|UBJ*)84`J^adYZD7vMXkhoE^?B|0_?Q>As}X_EW`AH`Te;su@x9qNAIV;Y z9R)Lv(7gt`4E9LI-hq8Xe8Y%0bl-L(&vdR=(YYDl`!L@zemv84qwlFZ7=fBxH;tW$ z@2ei=bJ&>ktNTx493maMIp!$K=JUj`9RPceJYPshmXUn14xsN{Jmb#TAK1XjinD#*<`-gw*Ebwn_>K497i)rPu=1vf9h6Gwuhv= z^n=}sYkbCcJM8_3%5$>$Q|CPUVc6gCgV|nR!!A#3Ieh!kKd0C4&B@4qp7V&62#Cf`vft{L?;i!$$J_^j>POt*H@-Hso&Yb0IwR0m9F zD*f$4&vJYvoowC2KFrt>iA}&aK6NV*KKPf+naQUNdGTz%@!9N_aM^MAq1!gGXEHVq z@g4sn{VQXRYp=nU!FMwa`=amS#h5Ky7w0>BtE938Qx}ZrD?an|Syqh2vWpY*ST%n# z*H5VPeo`=x3!k-pl(9jS{i|1)Q)g^gVozqw9A=eO`Exn!e!|A5Za)4PpVy&oGROJ5-r^oX#v+Y# zGG-f@#_KTSV;HGCgj@G*@|W@~dmynmcgvk<17%(pP}7rK3$tA)<^WdFwbTx~V<>X`Br@BjEd*e8U8T}wPN z=QhEvf%z_3{|0tX#!Tl*obOiIpWTpmyjwMzu<@z83a5@ky`#K?NW*uqyf+iNyNRIj zIhgCDd|u|gnb3We*p8`vP2+u-&)O!_IHCI`VQoETbLKl(aXq8$z38;{en{vpgP9j_ z!8n~%9>e)g(lmT^GKRzA`P*MJ<}qL!eV^INEN?J=D(*|Z$H3h`*#`3+wnnzy@XpWa zhG4Th>|^|Sas6<`woGyVuWv!-uC%vSYJDqheJic4m6pCuEqyC<^sThCR+{=&n|Mst zx1DRCYHO|1cS5Cat$2`CX=-h4>f3^{h;#lFEqS9Rix052RQV9=6kJ!_7~Ez$KFwO4 zqgzY$^h(P>_7~BuQ|i0$4^b4hJ@Mzq=`Yq?e23Pyne}FEq;0kcl+Ow4dxkD;=fx7?TTz|g; zzI{kG6X$&VFnnWn-aZNE^}^x!>TF-Xx4CDZ`Z-=U3g)%THdI&Wd=4*rHDhDgpO-du ztqZ{-z6bFA-e%mRHNNfW_s7m%^da_2o&U!5G}!9w+bZh(F5Tk9XFm+)cj=7JI*+_~ z&i(@3=85U=gTeo+G>mUQ;>*+U95ea8-wmC3b;(h)`nS*F|fvRM1R)yj;`f1 zxnB@=vpn%kZfU}nSKU46%<~f&yBFp&H0L>?doZy@Nnf@Y`aAjEZ=!lH!A-Us&Tpcw zjvu;v(d{*e^9VlXoxW4KBCN3-E5Woi&nu9w&xM@(2U{(%RWjzf7Iot@+mm4C&pu}w zdH&i{IZR_2>hq`imAYlo<^4*w9PFq1)gtI_Bwtp_{&*~;V4>TKAB~S97h4|Rh%CON(7C>SyUcb9%rt(SMH)7mX?TqJZk1_xoV(>| zEX023yr*D%+rtQUI^K53bVK;j`-C2|+B#M&kkYWt-SRY+U_W$i=qAy|uVid6%yj$C zq8xLl@|wo>=)4y>kg(hGxRr3`#r_;=?3i?W!3cKJ9h&KUC&X_NK9{i}oY;L{v2(_T z!+ht5DON`sGM{zGOvC)evyMLGIaoaFupdPJCig7wJ-VIA<4$PYwA~bT0BkG5rorj6Sl{OJ1)6W03E*jLO(0?3?a78M_u{-?%nokHDM{`8|h7_pdPTXP-_d z2sS5k7ssJNneALK%W*iYu^dNax<2S^^UGk3<;d^J+}N*-Z*g>PdA+R2e&pq5bbfnw z(~R8;GmR@?jcH6vI({zJ{e8~`4pm#kC;Jy}o^8u{ooW0pwseE;8*F7B$6?E*QKc~r zFAy5j_;0K+jo#SGR!eEneTwgaS@)g~-153IY+lqYh;92W_# zKxY~rZ*F-S?d(TZ%Fm^OOrRo!1MN!+8Y3PWkhhuko!8 zcYOI5{ro7xZrkBFT#9#*#|zkGy>Y&ue5!y=W*a(>coIM2n}_&3FL?bE%siNe>AB@; z>{OyoXc_^{l@Pg z!lo-b6lU4h%h-{ye;-i422*z$%=7A7nNGI%L3PG%<;`mOeqJ1dvX@}KpEsH?!6J`O z60j|;Kl7sQy`;M^X=I^0GwHOqO#e8$ew@oTKvbq zKiBP-bTm(896zj%ZPb;_Iqezemg9zYGKQea?XYq9mP592(#2Sk>!KWc$HZ+88Kw1OQ4dmr{<`qzh@|8w^)}u{mS}%YT3)US73YKhwjgbJ(aOn5;LOE zeGcK`Y`K2+x?R6 zJ;GgZc^c0qo%T%iif0%egHfk*CU#uLJm34QX z*7Jtrrz9-@}YNW9g9i;J|{+clF%b%Lrj!n$>?!$Jo#12e#Z(deQ>~4JPy-FNExy|(x zTebD41RZ(Wg2Zh1HM2ZfKeCN7wo_u!m(2UD*se);NoKomVrL}Q!ahTEaeW(Ofb4pl z*N^+-TMf(M;`-5eO_OTsxPD{`(4mWKJI7Epy10Hkny_s!5B{-4>>Bi5gxyR(?ss{- zgzg-4-rI`fSX-I*z;fn&m0i&Nk>5>I-8VSz1HOcBd<){+*XCHLeC8bNLf8n{{`kRe zCp-#vB89cQR9SJpb}kZYhK%nHbk0BjgD7l&omk&g&jZno!FhjvDSUM@kB`}gl;Nx>g>QLfVS78_u-%o2o%2~nH|K^!an9+d!9sU9Vdv_1 z;agsHlW<;3e3>)YcMM^-yu2|Ushb_0>qeulWZv5>uGxss z_RekdG*(Ww`()`}40BEKrP#SGiW`A*?J?87Vv{Y2^PP|L@hz|EdcQ>5m=ol-)A`-J zkyImWvvU-P=>A3bLNebEMF%O1Zp$8^@99j)Hk?t(n<+Ki6aH{ET@Y%lrLL!3Y+4j{E(8 z%UIm+-=6d%UFTZb{t=y<>4xpQ1u0qB?w;AUCtJ@wjp^>2v9O()mG==0tQYead3h|c zw=?z>%zyK!UzYCENw-eMUPWEX?uB=a|jOb`rkxlDHl)-Sg-xevgWws3YC0V5WN{tTElAGTrs)>{oH_ zF}_=1ru!t}#&qomQMP}h^E-Ai9%%b@N_RKHjp;fs4%`0JyJ@@#qbfU%#qVUg0qA^3 z6?Uro8#3Eo=*-Ilu*UK}nCa#kQ1+`UGS&~~ zxG^JR{S)h*wdI1zcB_mn0`nd0M>5+HiH%A+&k3vJZkkZe;R$wH|KF2+>p-3JzFQ~O z+e7AD`f1pD_@Ub}>8REYwiV$I&~2O83iz{8E{~5GJ7vy6WP4`19*G^FvAGg^C}Yky zwEb(w`Xu(R#D?LU2k*DOoUvU9ue%4|DWD-OhdR%7-e2AgX8X!wUBCASg2nx1=M!P; zcxxKRbSv44?7vej`-}b9Z8O|ZoYxD><7=z#U38yMF0VsOL*{(EWxx8pTABB1?N^5p zZtPcaEKvO7-qL3Wm&Yo*#qn?(zJ1qYm1sKUP31QQH2H#EFNcUO7jp>?J*#48S>3)abnC|zm#&mzkY`vdkx);OT@^mj@zcJlk z!Xn)P{Aju}l3iZj$6<}>K9Ou~Kko^d?m~p!@^lwqzcJkfVWz9?{MeeV^PR@>dOg*c zZV#BY#<>Z$zI(xxrGsq_^WV{1EMr?GwpGTqP3**s?U0yl6=_UL?3KjKkK?!Z&ezJ= z3xvIQJ~rh~-HS?GZ(>ning5QXwozW0-%ON6d1c!%mVQIJcM*=fu$Hp2)>Y+qi-N74 z*a(b*t(VwY8QUN+uctz{VPb<*dApI;A%q+6S9|Z@I@mnrMcuKmo3AgARr4#m0H^K^ z{9qRnJ{YqD0xZh{>JJ2qp#fmweiH87tQ zoS0Y@{{dWlYl~o!?_;`_b+8!w=2_i?ICXF0TQ*(jE+ZVeM+vL*x{)k&(k%uH-Q|QE z-$iJmZ5rQ2m_}amd-m*B_9k(e*Zona`@m(s=O*KHP^_za?_SO`sm-+=j+^#+ecg}D zbE|BlWGi!=kafvyCnWYo_c9H2J0s5vJHODe#yX{vv-s3 zi%ci;-*3s;hp-d4hrMG~r!!&RpPxIG1FtfSKi*&dlCbH@mg0~1mv>3FvJDfPh9A0Z z2)piki|m-$Ea|3ax)s!sK%bV=-wy3=r$V?xGGhxrV^ zXW|jxnK0L{yB^=I7jC5@RQ|Ewm%TsVZ!eCAN?ZDca;T%qD$VWuVQVf8;jQIEr)2Qi6`{%;yy<2a|^6hCyHH@nPPfA*%% z^QN|*|3mk;#A2SM?p2(&p36h`M$-KrKiFG@=SR0gim#3RZ>TBj< z49Hrxc6)5QEli$Z=0)AxxCLR}qazE&e8F#{zeXM%_st8z z$~mw$TpaJVne}G9*pJ=vdeO#o)jfvWVbS`%51Do8{UmLoUgCbzuCTEED`D&95d6k^ zIW*H*zvg8@e78I=&MPB6hVA0Mgkw;!PYEAS{#L~|FH7N!?>yM%_@Q$g_n!UX8T&V3 z?{nOp*l>LN;sx{9uUBMq!+b_@P^Mc5_Bpz%VID{7UcvPt!`I@Qu52lEE5XL$+eR|; zvK8!PSm@RzJbq+(A1&BHZ#_ zdD%C!^?8bUY0uaTDUDU|!}e*y*2|K_*H|wjvo!vQ&b-*y8|&rDOy_l(@r@;2x4fP` zE+gH3=(gT~aW-S~BzAkohQlV2U|btp_Y1?!%Rc0(F)#aOWt*Gx_P0zJJa!`8d0^Iy z{WRDBnClCUhEbHFePeyW0qm1pF`g_-+}@WxCey|Gf)iopg+r%feZi@OO=Bf|^I%^a zn6V`YTMmYaVlJ5Xdu_sY8N#N!O~#fbtnCDR)68urvLCh{^Y;&;KPN^}i)VPQjdfEe z`zHmLIi>{rEU|GJ`#iCoGxkMd?HT)5V!zDTmx;x>(RA;ka($m+@l5v#Yzm2fn6Y6L z(tCs6_mBKJWAzzIjqyC#41QO4HFXp0d6@63e9Cz_*zXeCx<|=ugZ?o4?tz5e^1gcn z``W4-jIRIw^>53|=7rfF-x4O+sXe}9KWs-N-Olu-#=aZZaih>LO1FP2Ldy7)Ii8+Eo(uCs29k1SPgV!rA z?}*(ZozL)H!+1Qt@u{n!n~3hyj5)TRa)14OM|I<2*TW{Kx{^7EI~iO5&FF~FYx@ge z&KG6Y>z6RU4?l*mo3`^dl~Ca*!U)< z{MojL!F;CgF{7>QZ!q7fj5))9W4<$^?yM}nYh}debCZZ~D(ni_bs2j+*^Z~tLgyM4 zCVqscXaPCkGL&k&Ix^= z`X3qdI?(uBH*KFXjhAtzJDlH4cOLeSTjFwZU7l z^PDn*uv>mkan5aC+VJN==lSDY!eqbG`QtqHLpNWF?^>A0RUY4UnQlmm&-aoDc8bro zH@-pe6-mtR3U5T%tqr#v1v+nFd435N-x`i<9BtRYb|eLJtgwBlj$;0Bbg%k4Hg!H5 zSsUFsgd^R(U|uIXe-CyD%(=i{5*v=*^Oe`mwPY*X3+8q5HiQXwx=xP#soReqy-vP| zu=$gHf%7`~JABiX?UQt$59V;$vCnDb)Wmne%ZZx6Cqq@nIPbY62V zlCkGuw)rYB^QY}3oY$+X;+sEh-%Psb2eLO(e9oo1;&R*b+1GYqeDB{o{+a(^&OKcF z_Z~oM6jkBI7G4E8*_W#grj&9_}<$NR9 zwlLSSc&!+0?G#_vEPs=T*S^~==1n8lbwuHcUwwBc0A7Z zjr_@`;=Jb;d6Aus)AnDP?Wr)!>sqC#zsR3+;YfEHI`iUrBiPM^P4~o%d7K&F+xVDw zs=s$K-2;Tp%TifhJQr*0Jra+Py#KA7>0aWuGqLrafqC)z=urCOqq{PvN_m#;3%eZF zA07V}I-j|D{kCXk>jz!_1oPM?Sm^#rJnANA?ES>9&TLP@;6rqd#nzwcewTD{9+W*m zKecR*b#8gt9227)zfS$xv5sg8UG!&dLN`6>PJj{Yq&qLuJ(JRX9M;&rPbA%n_>Qq2 zZ=(pinO3B`24T}x_aZvWu@B+M-z38J=Y2EXpU`=ZvcHDypJA>IJSAh+oAF%)Ys}xp zNoSjUi_U)+&^)=xUV{1F;Rb{W7VJp^j!j#!Z@TJ!NVb<|%(=3*_BrcMUD)1~_VYB} zfSJEs_Z9o5F%o|R()e%Zw}ms^7U-sruCG(n)^mU?=6bS;Fze+Y{Ak~(=UD5Y&U3_h zhcoxakGyz&EOYI>46m5C450$HARKHB!b`(8qAr3R3sdL%(O~Dp)`IySYOpgC`#fW| ztMNJRhtB>f>(;f-ewmp69*#Qebu{rzzp{S)AsY)DaZUZ%buiZhI5vju#^|1g{V8Kx zCtK%Sp_6Hwv+ZEruP@&b37yw%#&>42wf?8#*1Es`jF0Lmo&$K@cxXyj9Yw9|i0;FT zT}{~Q#v%AbU9_jyi2fUP&hJcD+v{*%OSWc=tW}3RO!{muIKp=8cg{)p`Zgw3DqMp!S{yX*w>nCXx0 zbM)0q>^f}!4)Z$M^K`KHVO|r@3&ZPlP5hrs_a}5O z65lUVdpNgwpMoE?TzS4RKH0;ta~Z^UPI(Dt{&s;8WubGvY1#J7bZ=v;?xK{gw!eY- zOmm@3_a5w?Wy|+Fz(stUlRxjFe4p9gm*U$q%d^+|KG#?wi|-wnZ8-sE{__6faTjI# z65Xh!%KmTPFn<@q%=5np2fGMn*`CO3zhd8h;I#|EPW@ovEYDx_<9x*Ti^M!1E=t5+ zN6nk!lPwK93})Xnf3js^zUy>Q#+HM59p$k@u;V()Yo^;9nAcXah;J1Pe20m{x`S;F z^IC1QEPpG)%!~IxwVe*fx)~3ta%_ zMO*KO`OG@nQZ^^-P;AF!I>!r-k4+kweP~k{UAEKlu~nw)N7!Tf4~cQ;RnDN_+jo~B z?3VXk^I-nexen0&XI^NgPW^AKEWSI?`E2L-j6I&x@L8Yv%hPx<(|PaRyu1g)>!f=> z(>>Iqysu|nM*g0F`CiK38`!W-{x2In3$}d&dzSbPgRPsT`zFly3F1Dm_40Mnt)BXB zFm*W_GIv=v$8@*64x&G6I}V-iCpgEAvQ30p_pYb0KWjS)=Q+hb7rG6S?i5(mbLdXZ zblan|p1me+tmi>lIZmVlkJ+X^ZkWH5U_&YM7{WwZ^bP;*IJlik;dRuHp{XC;bWP2Igc?7na?4vg!$dfVD{sOU|#{>bm| z@5neySX-IzAbbtmK4brc_1vkvw-CC2z~)`M{Kj%HuczD4MZFl`pJ2^&CO4IKJXq zmufA>I(1L-qvrq)%_0riKa=gzgsGxVwx_Xgf6i^MV&DA9KF8L)yhzx7k?Wj0sxv>1 z4X!=zpRu;Yj?38K#Gc6*r`f`G9wLhPMkcmn#+FUYXOW@v9)Rh7oiW!=$*k`v2i>Az zXC#JKnU_DeTwOlnP$%>Ihx@^zo@K`Ew`8K8Wgox}yQ*H#GOtCnje3@aZPc?YY_B35 z>9+BMX+%Bex~OM{uF4Z#SVQp?b6FZvTiJcE+o({lQ^;1~*2nkXI!4mL>=V1fyssU$ zkEi(N!?$l}e*{k3FJW#u^BftrzFTNs-XOE~ja+vmol2c?dLH+?^uIwD>}uG#f2ObU zd$1Wv*E6&AeEM5-hmk<&K7{%2LT^do{};1CP4|u2>N?j%75}F69CfxB%x~%cskLOz zTfN^s^X+>3%6^g9t0~X2-@)d5hx0sfm=~FAiWY@A_E?3oBXMJ4e)AyMQLx=%TV%HP zV|yy>;fz^-rt$BLJpj8N=DkbP<)@14^z-kL%UWPwV|&jibeq6j3*MgEQl0m4ZiYQZ zW(gMYc^^cb*G*x&SJFL0-8*h*8@gvxd&pKo=eOl&>ruD$evWxrp1L25W(clhgE33+ z53N;cw_n%%)8-#XmE!Spv1Y7zSk_KsRciie^AF!Hr?CEM_D_?4s{CnpHFnKEZT@NX zPm6zw1?EkL_y?nr@u%jWwj|R+#lDt*~azl^v=7-Z!lH!*zRI? z=sNAO`^7rh?vK^U4Z9&L{Ry3S|M%V(V>`uc8}`FuYx3eZxMQrAO-gKO!l84V@H>0c zV74jK0jr?+rU|FO4%R!dTQg?dK0Es-e#F;Ke4d-G!w)uvu+P%%dFk%sr7%->0g4aD|D!p?JlLD+3G+)$kNSYocFPMh~R zXm%!Se6o{ay@!?etb<(+bME^wztev^&3#+QU$B^$daV{L=CljJB0j$_;Jkhdm`9`e zn}l;-A9Ksa*mq83Ijm>5yc~xs*wkz&PCO+3@ zYebmjO-W3)(3QA^YZVE{XMaxsVLJ}4($!F=~VJ?!ohBay$Z9A zg8AIq?+{#`vHM`v4eD#pjPF61^*oa>$#kk`lI)1@A#~Qupj0o~PKSLlqJIBP_5{rK zb^T6bdmNS7e$=xp@A6q1U%^~Ex<|&k&B<5=y9h?qMIFT2;4|2#x{7?;XI-Ovai)v4 z!P8(}lddm1uivj>KkDjZ(zQLjPHt?E%`z74@j5JQSD2@a@1ZQdl@s$A4BaY;RWsYw zVb*;QnB~a(_#Bz8hOTWe;~mU$SkLhu)4VW`4_Um&v{+_43R~ObP*`Jo9F}xT86RQq z^-dsco@L%o^Zx3|8QUFZAHO$aD<<1GziGR6vh9N(@l8y&rWI^FVb`r)nKAF}neKBL zTP^8gj%*rhB;A^H4CAv7Clfx1_Pi$9%Jxg_(Ttr6^BZs8@8E`JeYk!-{x2I3vyHUfIHj>N%)XYh(=%J=LsJ--Y*#n)crLd7yM`+l zq-5vA{C5pKX4L4;!TE0ew6tH?687IUyiz~aRUg6&O=S$gw_mBN5ue|${Wamx4I;cf z%zL!K2E&eqd43J%`O$PY%Gfa!aLe1u`3651b=X8XcZ2OIV6$GEVZH}`31Ragy8t)+ z%JLaPunS>_!=Av8bWOwcuCKu2IFI$N?_|0u=wA92ZJaUJS-cM$o8|dz*sv$bchY&> z+{y1=AO9BLO>cdi*SMG$c~SQpe(-vB0pf5|w=vFZ=6TpL&+2}ibUt6Vtm@*L`SDEW z{Pi93;`zZk$aM>nM#OhFKbUS4kr{ukbDh3A8O>99>y7eW7Qup@i2onhX#CLKM_Aps z%=WRw_N0<6p7Dk40kE)rI_VzhR<=j3dl(iv&yA+BEEx`VCCt3s$H5Wo1z7(#xgR)t z$@;Qy9vrXsC#+89x?aaq&v~YqkEd5;x>L|OzO02PY|X#d8oOsY|NW7>dzbHEh3+(% z%G3@089**o`5)?rOq5Z{9Oww-VNtVW%it zZhLm7^LV^^ME&`k>E4YqzTalLI|E=b_@jF|V#vqu-i$`;pf+zCX2WvXyNB^S!8BGUgol3NqsLn|+e#D`)V> z?>E(8rmL+w<5L%GW5UMQhGDR665D~g4d(H)*yH6p!@<0!Grlu3TgO|O-?0nb<|#hM zG8xepW3Y3~UddMGJm?(e#Sah;-I*}w%AQj!8(zm;*?WS)?6b~`<6evLIUhC+=S^Lc zZOn^z)Ubj5g8UhOcijHC8KmnorO3+#DL%jZZo8?C_+oCmR$_irdsV{P%8ta{1v@%p zQxdy4WB%?q?wA<1$0hc5#!e>edNi-2ESu-mODL1;pXP#vt#P})ZCjY-;;`yi-{u@6 zboOo6sI5vI!LEY&tYtSCr?0}+bA@ZUZcn<+;S1vYcRCNock73<4ZWv-I==C#TL@>_ zVvLXt#QAS>-isf)p-C6Vk-A~Hap)ZDLboVk-?w`ipDY#WK96r2ajwwTYsnq@ao?T1 zGYl5GSCY;-O~j{8TXn&fNX&Z%!PbKPobs-nZ1eJtg*BFU{iMswy8+DdzJwp?ZbI1d z{t3Uayp|_)n-aFX_Kn8!cF)S8&hn}YTkA`f(8s&#EHNBhWdoyE|ix!pzHii4DZIA8|W>89>-=Gu%*|*8z^B z#;0xoI_Ds(5XQXIJS@g`b)HY}CS&6XhwU(!b$VgOM!-z>7MRCxp6;!g&ii1`4B=Tm z%@J{#X8oY#4u;)l+6Cw@+Ow?*f3I{UxnHQiW0HZf!I zoNkYd#dErYV3F?5L}DFWpRrwG=J{7JyiR$(Ez@}~)obj>Gq!oM{T9|(-tRJ<-$3-f z#ZoZ0d2soC3#zSX=eTcSIf=Spao@sYG0Ne+8^5i!OU9y47+!v7D2y;F7VHCprX?qKu$zydz!olu@+2;Gg zEN|Y|4$XA;p|d?^z!>&Bwa4R`?tXM0TQ6qpN!W)}o_(EQk(aXwShh_vHWlW)WO$b6 zr`R{$6JQ+fozguq(>;yObkEM%Q`#+Gzo%*)yqwr?viv;{vktC@*}i!l+>q(sNVa3L zG(Jkq_e7#j{{=J8>kt{)>XhfPu+Y7mbVtHk8gxfxx<4hI&&M14^A$9+n27`@jmag2IksyS;VL9gLEowE$;~2_SDC# zu+IsHZU@4qu{6I~-blmvVh$3_weB(BupB$#T-SbRs%MYIfh1;s9!A(SWP@OyKQQlL zz87!%t^lLDI<@b5nQjz1+ielj;FQy;-5ir6jcw80KZyHosqRg8&y>c&Frw&`#vz$* z@05mX6B_$-yr*V-&e`qH_as}-BcpLQP2ip{zMJQpp}3W)*t77>pSm@1ufa~s*f_$g zPOKll>Kwb&J&SL7jn8wP@!gAWKTx+hZYylxz$aUU&c37WP5jVpLHIy)pWxfR#%J59 z`xHO&w?1KY&Z+Isxi03^j#0-@cE9iK*rct@W5u>ymoVm?>e;q*Q}+=+x_%b(4%_3f zmBrYp&S!11=QG`DFxS++ma(&8uBq)oypfl4V6Lg%G1Hx!nAfPGy8vdta;{=|JtimN zJpcYV>F|nm%)h#;e4ebWtS`3r!)6c;=5?y<&CFKzOk%c&&ih+$z`TzcwyyR32h8(p zur|W~fw`74Sh4>2H{>s4L(mO??M7z_ookXu!0v?EpG~(0TOIa&rdt@c5$rFVm%`R| zUG$@}{{=e;wk|BjSnJ^Aq5}S-R&W)`yN8wwEO~i24sU4YobD z3)69foewiFM`yMdB-<*54c)P@qtQ*u@+Z?a7(Z1W#GOx?i{fi5dje;F_PW}#Zie%i zc8+-me(0Vf{0J=CT-(3n>{q^nN0B@AtFExH{hr^tP%i&1fMBn{=7;&cQlcpG;yntl z1FETwOyeD#Y50vM+t>U}!r6CM&vZ{G-5anT4Z1gzt{>cdc}=`2VK>tID zGxkWz^A6NS=zg2nzY}vVx-7PS=Vk-K>SQ~@;ybStxp;p01%CdWS9Lq1vz|{TUV@$4 z?G#wVw;Mm&4{m^wbf@HXG~Az7D(9L6i+S6@_&-3PO5+In30ZB^&g)`7>}2%PiD%QEJi#&4^}oLXD&VQ700I)=-_Hgr$HB8^`s zo$JKtaiP=Jyjacwwemd(b_=!)zTcdkE?`q9GtaWH-5Oi-H#gx(ryP9`i@vXcXC=ND3$p?~sB-j81dpGUXaq(dFyC3|*!&)pV;tV@;PE@WVVdy)dHNmR zdjCdjC(*}yD=o(u!S)htJb1WWH{Y|Qwh*gC;B#?4SD`GizX{`pM(0#pWlunmGfKflw#^tpILx3s=9M3(Q&qSyi1O}eKsl}!OtTX;|W z1?)Rv<1|($SgGWJOYd_0+3TA0UIwu%1ydgo_+@K@M`RRIlP;IT>)Mj%BHgS2=7&3P;K%UCV3oySb28{Prru(m*yP^>N^=u zR^F3Hcn}!h#ZZjz8W8Klb|f|*my2gYSirg8$?_dA-fLi3H05Gnj{@VpMxoR>^X2@< zd!awTr{pl`y-<8mI*&7i*9mpRcHr_R4NUWRpLZ$pNcIR~D+Oaape)-l@3(f`D$V0N znv~tAXAq+-F^&hW?ADlX)dz9tTZ0YBIp8Q(1B}0uopLa~%kd(xcO0w{7=Jsv3-VW4 zj$PypbuiwiQr|Qfp}b5O^|?H@Q|jaQrK#+>f^8}N4VT`0$>TaFUt-kfVq7=VmPTm@ zpnEJY$E#AD^O%J&1c75L#|q|4-r3-B96Ac;ymrSSt{s$jJb1j1TIOI^iEJMTvK_dx zTLDv9?k!UG5C^*&80Vfk_>b*?_LU=WY_Auef^PaM$Lxg;b{%9n#$M`RtV`;95Ez0n>rocEk;Bjm9?kLFm2=Md9y&Le`L&&J$!#6IA$y&Q&g)|uO04#&0XI|Mww zcR0|=;~-$HH~N(Q$ZbQXJF@&eFY>MihA64zJ_=3)Jbl-1EbzUNzO3Bdd*RZovAG`Sy=es3%$K}wwWO4_@%!of}#Y_@~F1B`p~Wyq7q z00e!XrX1(0kNMGm_dD35z^=l8?fT_QU@S*J#5(Q{feh!j{=ifp?;TiYbmqam+VHrmYX2&o%XXNLQQt zqf&`Q!Q-(Fg08baF^I)^q2A4maO-9Uk{e znaB0WpfJQ+0ZjGLKJxg!2m6t$Z<%BBCg8n=a$Jc_RhAe(PofyhG68?S{n(B_< z_cJK(TVNcEJt+ry`KSkCT*oS}K(I|6tS2x&TinONHUhRiuyqc`-`^MytPOdozGA^x zZpF3(#_wbQ2knF%922=`&hKOY(&6nOc^r*cWp~Fp$E&Bsrz}SkFxuB&d`0YRVCMs4 zBc&|ov8~|`uJz{QoJW6z)d*bcos3v{oL@c#?_3At`hk7*DhC@1jBB&!fFZlU+U!|} zR{|d2n@a&>-(tQmAy6M<&6hl4DF+)X7~h>$-UOU8U-oJCE$U-_l)ca49VomysU!NJ z3>e$dWMG`nU0JR*nMX138*$F}0JxS3V>>$-+ZdnGe+~>P1JCG_A&k%HiK)IPMfM8B zs7_y&JYApCmQ}*z_=YO>d3+Bbg)|qVEHTZ4>+A_A1fL(cc~I8P<9W&BQ&c4V!hE^M zN8U~lbTQ^ZjCqU(Zxk9a=gUoS&cj_>ux%@E40xO`hXbRp-1W-{hc^Yh2e(dtw*&K- zDzcPeIb7L;9NAsOmMAd##kFO=!V>y00r+QFoo@+SRXTW-+pmza-T9fZi z{juKy>~37sSF}an^?TmI^j$yh%PLRb_4^Q*+V>;!pifr;3;Rm%e_6iwQMOms+IL+j zON@KD{LBEB4MrcaKLO+C5;(pokLxA!`0j*aytgNBse^qCjGq%807di_eXpMr-p0Z7 zbHaS)2Gb318RCbp#yzZqT@36vVAlZCe7PQHIi7N`*MZTN&yb<=-V}_#Gpg91fw3IR zVVq*zx1el^v)&knGLgr1tn#)1#M6MG%uJ786amG@Vib6i`A7-j{=wX1N= zaxq^W*XVoY>9}?WFxCZmI?Y%6kjv9K)VQT!g@Otz#JL z7iI>=u)jN)j$vOpn2uqcq~7R*w-Gpo^#;}h=kDCoM|cMTuSa;Zcl!M`VoeBKv#vl4 zs#&kCM$9!U$4-`myk-QhS>JcC>v7IKMt!D9-h2eE6Q6Q;m*bqW!yQ|QtwJ8e=)e95 z!{Kb^8x8Tg^b5+K4=&fI%fO@mD9g6Ne0AKVEv*PcA)9pcohiH@9qb0d>d^?aylBcs zpZ4?FxDNY|*w67Fd13z%3;T~)*nh;r{!=WQ|CHzYkJ!)gA9-Q_5exf|SlEBWI`ZFI z;BNaP?@5Gg?TU@QKDNKhI%t2l zO1q*g@4eXm9&s>^8?=vWJ+?LSa*vNu;r$io^ugy2_72YJza1f{`Z$&_-xnNSU!+r(`@za1M*k5D_up8ENB_C9g-ECW zst||!?^;K8J#3)=cweUZel7O#eqOPyAVZt^{d9^A5sdFYD>e>Tw)=DXISL-jd#>Yy zNx?ao?^W3CdRd< zVu#_J`R<7FV!8?B>-wrzc+WU~IUX4A*>42KHLzG_vf4Fca8 zI|Q-v>TrGwu+tr^8Rz^yw?oBd${vfrcf1n7IL~g2Kp*fOFI|_AcN_xWLF4+kGtSBT z6oK!caXqH_o&k*CBd6azM%l9vn8(@lAxGr(? zZ2+dSmkRGtR5<5fmv$%_b4Vf z*x4e>zRmvY%Fb|j7l|#WI#?1IzfcsJyS}Ofb~h#_ zGdF?Dw9W(Uy?rIlQ6&Z|6pZ~-eN`p0Cjdj!56GVBU@F@NOl7%0%euTCnEH=(&AoyZ z4)18%JlO6Fu&vQP{hZ+w4zE^t?*e20b$PmeCRPs~+rd!yiv8F1eTn#Q1aRKRv;8G- zPMeAGo|tXp1_ygscpo_!_ae#bhgfBQD?IKQDYja8iye&j*!;e^#~ti1f=!bCL0dRa zKGT5btTL_<`v5$C{%B_h`w$rY%y$>)KbBYhJlo-Myro}ifzf}iU-*8B+WaYaEZcGi z_5y^{?@7N0Ppnli&YRRn?6-pPooB_K6>O1%Jtx>4bYA7XAlM5I_Of8t zpg}6{HNmz;hKju**a`=GTd*DA2jzVT>~WOiO9$%=`~L!rV-))@%Rzs!ypIA?S&j|l z)u4fMtaEv@Q5nkX4&JBW)q|(l?!czLnSS4vvMs>212z>roEm-Xd*q$($Z}0X9@iF~ zLcCoaY!T9Gz&jQg{u_OY-RS6Bf<)^38*GLf0{M=B0~Ax)slc=xt3>ujG%B_~mP2j+ z#KBay2#!+O8$|YgbX4`9%6{))D%-E8m1S9uMBpC9orrm$IQ|~RAcI&;_fU>yy6~1E z=Kk8R9qeM99|!DO#I%ojaDB?}%-8iAv2O&MjSJ=73dP*_ISm+ng(l+f``qmCZWG?y zz{qiV-K1|J$$YN`^>I94`*V4|jd;>)y%QM;`C3$Rl=4cz<36yyFUmYhC6Ak6v-TGq zuWpudkT*|#2{GL-{?5U4uO%PGDNpxW`ifsDI~w{}j)A~%8Ysus z4sWFJIPRhe26#HIQQvCtxL36|&Up~iJ@|1rr%y4I`FmCS;G73}vmnbocq}E1Ps!80 zs)KN@K23thI*I|q5E!VVGKcqj@VHl14-9mZhwfEjS~2~F`KtfUb1?NEnvBm=|NR=6 z+VT+cp#N?MhUOIT%N-8ye(?Bxw9f$JoXmXro&ev2dfma^6RgH*Lwzvs@ZHNecswYp z?|}1N2epOs6W2caP7HZl0^{1}uQ*558ChNX{N2HH{ZioM8xdLdeYR8TQ`!Cwrn1{R zvV$SZIvNR#?a!T)cXW6|Xfu4kbvyex^U$>q?*X-J+X!y~Ft{?nJI~=2gU9-~8(2@t zw;VCoz`t>L@Abib@xgfhjx-+3H`?F&Y68wd4V3o)2h;La0aN=v5PclG*=}8ZC*qpz zl$iSO90yZ<*8o#}e}_JfO;0=6=fLPweFo(E^h1aDh44NFMxVMocb)hxc=Xjm6qY_E zPknWqU{(HOot0M;PxXsBb6;%IgS=3U3k` zxbix}_zd9#=;LR}I9IYP=OR3L8P;gPRF?NF%=eF|G{v}YL2Pey1jTr7N~{NbsMtY* z9p_*(fiYjco5H^D=GzyBs4RKZr|+AQhE1ABRIrB}>_}iGkR6SfKBYds zAH(mk8i`nC`8nOG(6^6+RpI&Y?d4}!O&11CGIWfLR z$UG)H7@s3E5AKcNRwt0hv%=d0_@5E@n-+|D9F9P~c|V5$4r1sE278kL4q^ik_+F6S zTT$Pu2-J5Z%ER%%)yI2X#Z({fu@qB%x~EEgoFj^>&0 zO$XCFhB!W0FZxoz=x0|S-~Uof^?m4Is*mq4vCe59?+v)GcbQ-jV7tNw-g9n_bMlC> zU2*Q3?qJh^nfH;PLwUOk?+k}G1K4aRxy0eIy--%yVMz9Bgm)}r)pwL&*Ety9{W%H( z4>=fp-U>|Dlhk)QFy0&S-7(eoD_|EO@dF221#Bg-^Bo`D0qj9wFFM#`!04BLGUg!J zdjS~pJ(G^q&BQo15IfVsmg1ayTE9XJ zHU54W_q5tVn7a>0eajKJ*Y_A=`bDu7yIKrg(R?zWBpZ3KZjO~f`JrAr0&Px!~K3!X|9H%4DK8{hU zj~IU=)WsG9qs=c0Z#1s&K|ekHVC>Do0hA>+9@wveX}c#j2^iZI*AdD)02t?euEWr@ z0`ochnDT1C<9yCGhiVVZ=eGk>UNd;*AjGAeGT&o?aSq`7k;*$A7@tM!JBH+44UD$% z`wHl1cWt5HS3ur%;2B%M3$Kg$`FzdeHt@K2IL7hI9l*G^84qE6XNU8i%H9bc_X*De z#)J8;#z1sGe7Z(>^w%r+!*>@R#yMq)y@Nk|7a}5lA=VH5k-TZRP~J>ne8=G^lv%NX z!1j9FzAvrV7?D*UP~Wb?>*d(OcQcvq5}EhOs}m=F9z2&4YXNv~P3xK{39| zN$fEP{Ltn{;+`c66V+rZ;zD5ry`vYhLPt#+^{fh`1fB!rarlwj2k z)(0{Nq8!r;(!3I2l}}C^n$!n*9|4;L|83RttUOr9O5--W=yywnKqo=n9nWFv+7BIG+(cFxEa#rY*!e!!Mlk3XsOSC8p2D zQUF|xa~?63?G0JZQCzbq#?J^6@UEW#}f|5eGuxq+0plz=o{gbjTrTXG3s+M>f1V`?`zRFQ2HBv zN{sr#81*T}_Im+rn0PP7Pn@%C#I6B04cO-n_G@6=cjS9P%DWEdv%%Bn*p$6qWH(3t z%3C4W77lh3FzP$a!5$IbV^VL__ZTqd@ri>yF1(2Nl)NW|$MIbA<+B~ia&A%VDZ$zt z>}k>Wn1gW*Mf+Zmx?~>fMYaTOU-i8&vgHoO^*ZxC!@>A$huAX?_Bk--@kL=;-^YT@ zl)CJXd^tYz9fBsD^C0#t0`Ez5%|+~JT=V@1u0LrXu|{Ag_p{ILaB8sGC}$h6$8e2P zgYAzKex?;B`q+WM_}woedu5d1@;9}zvNdA#?Ra^-&-7v<2^s;%DPg0ygw%IZ3jCK*DPDLW6QtwOB%-hp#|mR8?CI0$mwY31BSSX%5DBM~PkLU?&T9t%LDioj$n3!T2nbvUfSynSwp-V5|r7UUsl^ zfU!;Pj2Kh8DVw&*p}@2p=Zfq^2jjg6_3i0k+>0Sr?O+mODC zL!Vv>j6UGpqxRh>`W|qwm4dAiY&K-MkNB_DC1v>@k6V|-w2rhciJc<(YF!dzy|KJn zm&CYN>DDDNts|{VVrPl0)+MpC1=G4D#`?%sm*lDMwJwRBFZ#4Di9Ie@6=M3C7{^_f z;}{2H9TD3<3w9CG-MXZ{%YnIdNsMy}^*!j++s%SKBG?@8sPCVt%a0(#a!__DWZk+X zMq8M#)+I51wuzY5C9x|7TY+=c*9MH`xZA<572Z7##<`aI*vC|sb1kuygRwocE~ALU z{c;#EmDM)Bw}Yww_HnS6aLzom-dK)T1v|mvsh31_Ili01jfq5cr*4;}ENCHDtMGbh(4g1;%xg z?prXAqk(bF$~|!`2Lfx>NC@Mam6+y1S?<$NRz`;K!kEyqM)D$DmK zx!!%n(RZ(4+c~@|aDEMV7a+#1t?||2IOn>Z`-}aTp3tm=z6xQ+SHLJc0NfMuF#hjk`8c-iWF6?i|V&Tki6 z+&aG#Sh&tP$Fdx5o!<*AT<6piuJZ?h{hT`g9e6*d&dH-KZk_)@us=9;PG5!V{0hN1 zwyW^8wxI#>b5&F#Tk>tJ1gQD2exfcmx+-Zl<4P*ks62_HPb0T`=9Zpg#W20C_r| z665do5xZY}Kx{j~o^`N3f)z-+CvPLcdOFyh&_y5c-dO$eiR8<3AWO~ngx5!!4?XZgIM#}OUg0A!FCtyV8J+sasQ2v-*B0Ej=;mOD0b_sDdjs+g1;)1aARMeBXCu&vukbl-ocoD_GDin+c8VS7e zktb)^TlCLz?HTgPan52UUmwdcCJ-xf&XTycyo7q!PqnLjn~J4j#GXamGb5|*i_h!+ znfvd2RE5g&xt@Ff&9=$=2GgH#t~}l&5WCXBP896d4weAMHNhVo>{Q`B;$XZ-puRU9 zjL&|Ylp}0W#YKd4;82SE(J!v?B-xs0^^=3?<1A>dy(B3v0^vjoMU&&;XMe9<?UCRo(rvW@@^LFT8DQJ zFy23M4-DA^?(JT2c=v)A8Dzh!3{#!4MSq)>>qX8j%tL=~^jn;(&G$i;_nutK6#<`x zP>#U+!d=Dpl>IGu!)Ds=Yg5^Wf$`mF-UH&)#+iGBJFK)g`hgSq1 z-y=@}V|}s>O_BD@=kuzsD|qy2J}M2(I#Axuz{o2G&i697Ur3H(TuTu+l?yvWguq`X->> zxOR2*4GLk@N6eL_KFTV_@5Q5ie8$A~;_54Nc&tPEg>#U>Up zpMyt?N^xp)_gY+Y^j6oBC^M# z^OA?E@X8PleGcO+FK{rr5#hT(p?@G&-Vrz_??u!v{s(v|2q~`xX$!%-1$p7W;dMbe z^>O@A-hAP8g5CHZ;5`RHc~hzYseafwCpQy5roH<#*Dt{SjM(uo-yk9RHmNjOFbP65ADdTHaS2-f_aKKn8ri z;qpd7R?ETt4eGlM1Kma;UIMbpI~!@NkN(J%a~bt%z3F>}#Lhr?9=v{-3sv?)VD!Ne zFoa_hd0MtV0aKpqD{LzTcn|hX^J+xjNicYe5N{F&Q`I*UY5bn9HxTn+JJRpzf;m3# zAe=vUtLF`dVJholXhueMFxvPfE7I?Ou^cgkcOY8^)1mjqt_OUNa0FUEBM_5lJ(dN05 zZ(oOZEO6#q3k+2p$hXYFG~XsimTi)<{GIoWLb5kHn9B0^z0^Lq$$X~vSU8kpDecqm z{kqP<^fR^30b^SuZyCbFSEHX4q_K;E@x9irz&grfbCK0N;@~N!d0Yf+OW|oAPdS+8 z@wDVI8r%!eM|n?DigV^m>=s~LCw4+5vL0t43_;-fJ`aHMZUc|&za4)Ij{(ND z{4i-l#7-1U+ZC}^VD!r$9NuZbSdO=W^^<(HKHhP7XMo3Ya6)05bnVkUXXbIXVx0GfBa17$-uZyCr^K8i2LBmI|s7lU5|X&{#@P)V9L7;Jo-T2%Or0Tv2P*dx1xRo zZ7;_Gg9)Y&4?}z+9Q*??)%P(HxgRkaJ|s34oH3~DC(B?D&K2W+%56|O4{Zql1HTVY z3joPxy-5G@yY_W&n)SvRf2W6SBe)gLf_tB~EO^m;syLU&}4q;^sdvm}r6$bQuC}TTi`MWKYoriYH zw(H6+1lB(!dmJz=2W8ia>;RG70Wp7v;be!m6uhUVVh!zJ%YiZ9AAxc1cJuuN7~8Jv z`%go%%$KqpPbsVU@;AxUzDtnDk%Qr5=^rdF_wfgh!#ko5c0IBE@Q%J<+k(e;v-p`y zxZ3C=b~~_Zhhxp=V0Q!Kv;XmknJ;;K*1>lU`0jyXcOd-%$m%m5^7!5le^-5f#4y{= zQ#jue7~k(>+ofOichwI7Rv?)Eu6hkH&4c@8{0;RM2jf`%GV;}NocX>0>`P$WBU4$v zm$AhN``ZVKy#Z`Iuwf_<$6eY&zp=dB^H6L#Fy6ln2d1*`LiSL|-t1uS0XqTMlMdE| zbN<%D{*YJMKEPH1_$9CYcjvm6f%JNwnzc1@RX$R!dR(|hS z(!rQ7%Q4f*_e7D^&m2*<3oz!Z-;F?w`+iTtz7J%qBgSWA^nI5s*n05ZgKV3_U#5l%s z>{lNBJp^A75hE{wSb1EJ9R=(q#AxP*M~u8D5i5^l%1OYsg-vj^;SnQmQ((&D zII|qsF~B$$(>`M4>GJ@VgKgn9U`g;$Ji{YK9`D^%AKU69z`CIjxP37^V&whk@VMsV zcy$nX9E+JRG4l2m-!os%xt{}T1J(=Y=_NBaaw)d={jUWqAi9yb{BF2#n|CVc0ah8izLo*e5ZJ z5x};=Ie9}7sPArv$Fzbnv=uZ`>LIU0c${Zg4z{CHa($bN{yM`ejo_5)z-XKub9IXu4qOx_mg(Cj}hZ%bgR z?{V<<_#X4tK-)*zj&4B1-tKd}iw?}?QQz&r*!Nt0cM5L?@L>pi9$JN%vc!1b`#J;; zN1TH|>@bA)fgOQZd6XrOvg}(fuiW8rT}<9w#OT%mUX8<}owVgw4#sgI7j1qKVstqp z%YNA%*olbM7Rr)GS^9*wDDNbkE04Y3hK}?|8vpK#Q*4an!E$qsa`Sj9 z1CMi*%X>P+V;@>uR zeT{Se9s)o6rr7tu___AqIM_ELTPt%Y^WF}BSdQ-bY1!exnC~_Y#`PC5eK(M@rGn{w z05QJPoAWsOePLSPVZdn1f}%9GpU5t9u>FCt9Dj0TrwfnYlcr^xA^MhLA4V~*@#xb} zfN_3veahc%R37h@Xv=U1>nC~ag?d-s#=?6Gi(SQD6aUrpOk-~dHdN+Xh?zAl_r1Sy zun)lFes&ati|YFb8270!al}=q119#agKZ||xE~7v&0`BG$2EP^ z*w(@uBlA9O=31J5nT?wcl`R(RaR)m{WNT#Jr|coZ``*Eh6f8a*5$yQSvj-vXZ4#kt0Fg^+gx~F!IIpI3YPZ0Dre=&yYrqJ{Cv06xNi%7 z$p2yBk2&yYmo~4cPsHnw55sReCE@KfHP@SZ!C-IJtQ>@V?}EWa-pZAE-s9yt-VZ-^ z@*+sw8ppO%2N%tp^<$@5Bd7MkJzvh5Yx;LuxzfvBx$=ijKjJ{~c$)^>3|MOZ0 zMhgS~TNAw|xc|M@fv0+b|E+~N69WHRb5HFR_}^MMFfZ`GbwXjU!2edq24hca$c$)f z(2PW{){q%_tsygVT0>@_a6vN$wua0oY)!kux&@{OEolvS1D@l< z^M;i-l(ZgzWlKM^mgU*3S*={rT*E(z>R$OxUF&b^_Ax25PBSadKCNacc&(-2FPA^T z!{}goiL6yyLyOivtvCAO<|LrwyN>F%U1hfij!1X-AGx*R9IN*D?#564IIVp8xZ^jv zb@Cg>ohs?;#_ed1Kgo4UuHTgF_ay#sT$MRKmh1K7F1>`uC&K?s;%_B=qo~b%u*ADa ze6WodKP=blO}ws8#dyygsfjjT-)dtoA@;5Q`_A9|FroCF)wne@2cK#2z-_BJc(2Yw z7rYurNAay4?ECQ#4#hLY5yP^3qdeV7uJ@BTliYt2=e-f{PkFGM*!J*p#GsC@@yNwL zn6ADd$aAK55`|QQEe^9MhRFEum+Sw#{s`A+xc->l1EI*?sGIuco;kJz@YmKquk+1r zJ^I0{=6F-{u%_mUVbu-5_rANgA#xv-M{Kpdw$ga_=45-ll}+|O7e4nsd2DvOP2bU8 zdVAe#ucLDP*3h87w?o%cqBb4dbLM#YH}-m0xn6#sy`C)Br`FqRYyp|$x#R6M_o{gu zoUqqh+DmWp6njk{@rYhyuZP-8Z{*JQ8rzNLSh}~p?kU%AF0$9EFL8yvE|&DCPqo(( zx$gCAd(Ay79^3!cUQe@^-ga&FTJtX&XRo#VLvOR!BZPn79rjwst#ek|>rzQy6w)_h zmQCj~KOPGYu-7`SJ}vefWRtz4@3QIKljl)%w!I!`FTF8K?Df`ieba$KeGiVc*Xq9s z%kA|L;lC{UwSDb(qfOsI(zgilzlqy)oflpyv)4L5e1DO>9xU>Yo@KAq-uFV+$A|1+ zDCM6e@@sdp@*HD%%sIqfV_Vc5_l4TWx1s(}67tuf%~qbzSa|$3bUi;*zV3%vzRq_C zRNHGj0yW3kA^%)_qD|NKcy6e@UB8P>XP@VB{w4N$8++-!5$X>ET5P)7`+dmXyjyMh zaFLH)Wv{jU-+!UK9wg~4w*>j)m)UE-zC@q4@13r*>D!6?gDdRy_Hw;(sK1^W(igkd z^0mKR6&gQ8jaN}tTN|lrDyxe}S{fQ6wPj7!aZPjMr{>8>(aT?2xXJ#xj*siHNW*r% zd8dVmb3)_iFX{gt|D>+(X{+FcUM8M@f5p3|a?b5+u4C6o`aBzN^!d6om>%gV>DO93 z`Gl3PzwqtlMt)+CfPCsv%Nu^-=7%snc^+O$!J+z7Yi;^w7Y)TzBIsXi)78G{->m*U z@BYk8k*SA*@`Mo|Apf?nZT@4n9Q+~Ey<39zr_QzMmmJw`UnBnxKdp~)Nc|>1vgwQVIT~+c z;CMBdf9g$}{y^p5eq?guZN6EOuAjCRn?C!(sHwl`DK>vYA`kty4Y93!JPTUb*Cc8B zdq^LEbe$ijg!*?I(ql-EBJemPBtIAF)VFbcru~o;@b*BgO&!&Gv(^JSl zg8UhHgx7x?I(|_<{l~y#amat!^wa-8HNL9-s(<=FsbA$I#=7?9U$TMzq1v$sI)A1@ z>)#u)=-2k4^7R?oPp0&2{(BMmv+dExJpQlEU)k*cPp7l}a%^DW5gs41weO#s{_oPC z&41bK)BcmG|E+_6*tRmYFO|=felO&wK%RYw$GlMc&nBNS}ki zQ~y+j(l@kz*?;Ie_0NWmpJD&1eyyMI{HgV)xXdv3a`(!e~lIYd=Z-8SD}4ON1FQY@{s@3zCw`? z&mV+oTc-4E@@l{K|HcmTr|wMpwR}-GZNGRbdf`VH{^9QdDs$Kp`?QTwv_ zZ$s_Nq<^inkKxul@7+-St9}1!{@LW2Ep5wWALW^Mru)@Z^&|i$ed%zUJRS4e-JdkVe@nnwOd^g{D1V*bi*2$uHDVs^2=`0(|z@wx2@u$j1nP1ZXb^mGm%jEwJP0!YT*5f4^?l9V2 zJIv#u{*|qM!}{lDSwDo+|EJ3r*01(u@~@_6>K~e(Nj{r@w0xQL>-Z9(A{^oIYi*YP z{d4ta8o#pTAJ(7AzgoU0O!8VkntynF{CB6T z|1|$_`LpGpO+H(?>d)jK`k%I`ePRDl?x)f*{r=?sz=o!0vu{K7Z>YSsU+q8P^~ojcTQ+`u_0a36D=E)!Qh$->Ov<}ap3^Mb;s(Q$=V1CgO!cLN zH|^YU!+wevTWR&>JaCJ7_e}L@?CTTWlRr#p`$>H_S$%H|eEl5qqOV)~lM?&-gjaL% z-%>xR?`ErSw|!nQ&&AX(jbk_1^px;Y|Jd|SqpuS`=?OpnD9_o17rVvs7dP(yB-5i^ zEHBmB#=bt`%^7si{p7`Zi@sh#UhGz@Z|kwUJV;*Be8Lp-?{~p`Q^MO~*S*d2wN#fCCNCzuwh%9NyVdvL*<=qlIqNvRL-`(SxvcUgVAbt%1;Jg>;w*A}YZl<>Z&>t&u3C#C(x!hXKn z>N|diLF0@*$u|~m2f{n^=x5BUOi{@<70NgE8>{b$$pijEeQm;vgxbA#f#prU@{3K$ zi+&@1`8rtMl<3=M|C>gW7yH(xr-ZM5PKdrEPTH)QyhIXZ*bAT1&OYYY2NcvtEND1$)+zY0V*CzEF4b^XSfPEiezvf-d_?(jV9u3(S`>oCQ zpsyczhx%gDk5VChDdBb7a)o(6p{=JaM?_-39QRv&w|sHqAE_@Q_O*rDK}vWBK7FMb zha%d~!|nb7tMB|*E;p}cMTO^u#{=Q*{`mg)FyA)ub1c-)V-H$=qrPs7l9!NiEfE^m zQo_6X-NVf*YB6cgUZ@Ptz!iBP`Yg;I`%@7nh>Li4KnFD3eRy?&?j zjXv#{VZW@l`X1Q0&&7r(?Kv54&%!(HFGY_Up43MoT)#=HZ?D@%+473ML`Yxk_m-E~ z?g{(emefZgWM4{nSMSD89m6l;zgXCR4_SSG{KFG%|v{K!cj%b$n&H=QXyVScu$Nv{wUI7GTukR<^6-zH*Dj=Bgso>dBgSzZ_Ss#zSQuf z-zLKSV~y4K)%ow5d7(}6jfV0~3GbduUoh|Ec+yTIp>o6?vHA}Ac)oeBDJl6yB~Hos z;$3BVr9+l2HukNw>!!p_vi=iZLU`lf-_?xIiCb)XY*mmKdrJIr!jeYni(GEgy(@w| zug&r%+%axEdC4}L9$6v0bv8ZQ`pRFA{n7HXt+SM$dPekTS#SA#u_xQQOZhReC)@f< z`6<<(WgQmgr?RZal&|*0WWAMXT^8nNTc0W4w?E4|P5Ek1D$9CJ`M&-;Y`tY#w<+J( zFZ@jFH|4ATZ0j!NtNv{3uP{H`I!yU$Pb|xNO!;b0D$BYo%+IzyYsb&BUQ)i_zp|{G ze7?5-EbFH*Kb2)2<@2S#$Fi)al<)g9%eqSWT3^}LSISrY+16RgPdzK+RhIRZ@_qeT z)?Lb1`?IaT!u(j4by%36%Ca5{^RunXl&|H@wmwt7mN(lvEzHlh4pY9`6U(w53-eQ1 z)@AMZS=MLD_sg4Qou+)XKihgu`M&-v>$WgIm1X@F=4V^SDc`q0%X&`vzWrI&bv|GF zW0v)u^3|SLmUW);)t+qYJ)bZ3WLx(sKlY-GC$df)GhmIquU%vB-x3l>BvyV*-nT!a zWZ*4aw|T4V``i(UQxYpb{Qi0LV|%}zkT|kl?(fB(*z?w|-ftgg@7ET|{k_Do6NCKJ zID0>P-lof5r#Z=M?fdnf#3_l@p6J$=|MDS!HuvYrTde)wtu{_cTp6DquZ>hUj3^y3 zc83vVV@8Y|Goo^Ad1Q9HGBP9H7#TS-GGh2Hqjuh9#OTP#;Uh;xb{IZt_;6Za5A!lV zPS<7FKi7Tvi178j7rFHQr{ojJpLvA$@7sXKfJYH{=zH<8m#qI2f3bc_o_U`6T!yxr zaGdCE*XyyDtz6sNHok9*=bkZ&pSMp2Q_tBrsj+^JLgb?FSh=T#Bx6kJ&Jf_I=Pkk;B#w{yte**GRfMX>=-)~E1 zz{B!u!RzSx&5OVzAT#jD)IK* z`uVaYKhys88Ol#xKgWOcQ%CLZr}R>{`tLo+ceH=NdZXTK^|vZR{<{9p=Kn^>PeDEr z1Rh_@=X37OfLm7D{&kXn*iLOf;d<#vzN7MI@=I8r(x zJzW0v8SDz@ul9%Kf3E$R@~3=9ehKHFl=7>e^!--aRSYr%5B*%Py-L?V^Y5sgYWc(E z3d?6J|G!)Qr~F5ss9%1n{dDAK^$XK@=zG`pD(yek6U!JbC;itE9+uC<`|AIweB>j$ zPn_J;?oThdw9>p6*A}z;#mO>>=+@JHlSaB#ugY;#+HfWU!T=FznN#DIa}9_Qz#kJR#Q+iDRL3 z{r<@|=|ACivI=+vdKq}={I?GHa9lI+(C;g;SLwg1pM2^L>(A6a*`7M$r#0I%)!&$b zp8y^Km4S!a&+^7_9Yx@w&n@g#`mgFA06xpgz@tGvA2J2_99%Q-NDBVX>c1CyIx6ql z3^>QD2=Zg#q2;ny>A!0Kf4hGAxg-C~$$-!OC;ju!>Y@LO;pXsonfAOrbN%1ZIQnzz zHxXJlXg;p~j{Ng;^>0Y~>1cjpzmC921|He;uf?|~-wWO=yCm{pO0Fe0Urzd*FsBDG(9Kw_=@F3_1^$K{Sa;s$qYE#PXv4h9@*-53HY=> zte@jd1UU2Nq4yokH;U`A1aau|JbRV?tM-%Mk$#Tb9hK|740u|zJyZQZ)ehZy(e;Vy z*K+B4Fq3}T*^!=927G-6Jd^%J2ENt{^X8%Uw}BtSbrgX|w)utS?Pz?UogLv{Wx#E2 z>A&iK+7kgBZa>Kkcq#*))@;xC9o9Tz;1?r~@B)YS_r)3TRT*#{S0hGCT8~_|i!}cm zps%C)zc&NEHUl2+ms*Z?84K`#C4c(Aqw+Uqz!ShDC<6lzEoU3>7_OrTJTkRgn`(b& zjpxY>`K$vz9O(=^nw)X8BYPEN%tQN=y=wng{U5>S$C(EM4_%*4&wwX@F9DB%$LC^K zFW9>t*9<(qa_qH8@UQ0oQ|0dk5e6Pwo>T^ZtrtApPpx$OzyGfM!}iAF_C6!^qQv8O zTup2AJsOP@h4y<#^;+XpLC1JB1Fj{_mlKX79rb@22?FeW7QE(Y}B%Jouk$%fc|NSw2YR5Fj#FP@JnyLga6Ip5+=yhrhiAZ}8F2Rhj`YVe z;EfsZLoefPx3k~RuItTkJ?)q!eRP)e5!+k+I^Tu$ z@0=xl_blm)vZPPRV&B}*?+1kKJ7~DIzjHW2t`EzS{!|wGT1%~dov*^#oSG&5%q;0) zeSvHF#m7!KIu{gmF~3QGpM}iBSXWrswQJWNJ^OA+0fThz+`ack{rYdR>1Mka3_{>_ zE+{a+PBoEOZf;&ajsklWnGYypTm*>Gwa|>f2a7CzTQcANoMcf^IWZjai(Q%M@7{eD6Qe2iFb17R%pN&*m@X{3gx5J3rL8$IyP%-W zVmZbQojTF<{Ob$`15D1HQNF^$TZtL-Xc;rg&o^K8U@SJ~!h-z#do2wXLa3++GgSBP zYpf*lg(Y%4Zg{r5OkkRMSvuFKHhHql<^#br8UBMll(}0sGl^J7L1955!N03MlSOCN zT-R>|GZFQ|XfH>JbPHVttp?-lMF#2#^(o(wCb?MO4iFwaKu^Ilowp(eRcr=0OcfVf z9&Ib2dQQuu4W{m=6FL{{q53-I8Cj4E_Y$7964}G5eT3Hu`l+iYe)IQmVn{Wf&oiYc zsn1n6avJVHX@& zqV&32Ff@G_LJPZhztzaXKI58#LYnuR+?kL+|hyenHobGJp zpAa+UHMN9_>RkAZ!6?caqcvT+=I2t@G$$AXapc>Nm{d_Anq-e2J$eo%=H;^W*gSgl z>^X{X5(!E#T{+n#J#THv`x#ix5r^6o$o!^r@X>0z4~s{|2AUu3tCn8o|qK+^y&AAkfH^p&{$f9jh@weat`(HvI2x zzNXBqpe0-7IEMV9X+~m(Q~vKrbxVSoQfe-YIW$k(H)kRBmN3 z)3s;_2dK_NES9Fh{1SuFS{$9toZNF4VlbKQ$>2zd8XjO7j%mwe!Axn`;y|BfFg6Z5 zxUk6_V)S89M!)FUZ{sbtiVPfhg28Aiq)adD(&co68Chd62k!HUk>i_^m$#G{57@{` zhIs{78d;DqCYfmlt>`wsQTRbBAw5*H`h74GBY*XYtV|eT{ zJWS;kzNoTd45OD6qav##?==@Ajw*azF?4j6pBmp047nJeutj`8%<7lHsj%pCi*ZIq z+r!caYpG5JMz3X>d~-V$67vyrlH0}b$W0#xgI74*+lnhH>g)52oGJFkR-bJ?(lR&q zdDLg~*pisAY=!3K4-%erA4`^>UmTD%_T&r|Su+rUgY{##(FV)Q$J&F7FdRL4PI6_D zZEk*Hm+8bfaH8$#F~{&o$i>ppPF@v;hXSJ>!82ML3q^$uP>Yg|m~Iqo81n(P!&Mt7T`yBWC*zT{hle zX27z|9R8VNd8}>IOj#xSrS%!#FzG;pnFe68ApamM%gTW@wrL$n%xGf|w@0jx1Qg;W*dwm=O<_rSnC^*n@Dc$E5)t%h$Q{ zH9iJD4R3l-dBFxy;AHYna|<%v2fTw^g~nW-kY=4s_wabxpy z#Ei)_o3n3W;cLXi3KSSQ6cxQ=c*az^jz{6&RUgYhZ8$zNm}X!aYQZ;_$03J@0dwR> zI&JAGiNVQWN&^IDH)3Y|BF7%R^anm!UO8MW2a6xv2J{(39x`QZ7vc7j{cV)Wn)^{J z9Bsfe4um9v*NEpH2#M}FUUWU)bsLi7#kR@uQV6ka5hKKKb*y5IrB~JK`K6 zHVQF9Y$wDBF>E-b5MpD%qt1^}4g`MnS_)WfEMkP%&WI6WyC6o0?TS3XPa#fHZa3fv zvE30P#IR|RLWqrnjq~9T_{5u@>m?Z<10OLQkH9p9BtnFnGsgl$NFbyjo8&paW?=zv zgaqU~*cUw#X*_QNuQJz*B2FO0u;CHg8hInc1|dd>4MvO*LtP}n@$fB&QG^6S62aqU z*%2uJMCieJVs@?12@?fI&eduz)vs6 zCLnwQ3?Xtwj@QOKE&?CrNFsO(alQ;b*)!KmA;08&bGVViS>$IC%#q<)AAb}eiV&NGbfhJ49(fgMh`lp${uR;@Cm3*^ zMC|t;1BoLAae3&0a@cKgzagyif14C$o?i9+G zM4kzz155lJX=rE3f8ZK%bSml{c#>t<7~uk(Z;bX(j&xoRK#UOE3$`N7+XUD*@EbxB z!K*-hBP4*wEpa1fG|zYuvMc&PgX+D8f@it`lONc10&Lr9@7 z$F71Nat=j1LwiY3t`h$H7Wv{l0o@+^4%%be)sQ_7en(mYSdw8Z`oovVALaEh_NFlA zB~e~)DfA#D5RwSqGF&4h5RwSq#kfXDvYn$3r&i-Si98Uz-=o|JNrcElkU>ZxL?1>v zg7*icBP0TaLXzigI7dh#cvmAJj{X`LLXy|l z;2I%;kVNp9b|cOad)FcjA%TGBpkCrS#0cK?z!4G%Nd#{Nt`QOlNd)f(Tq7h9k_aC3 zd60`TP&cnv;vD%W5TZCwAS4mIn{bVgKu9v&4D1#J#L0E=IYRQUxV{}cgv2UbBP4iz zC-6HEBP1Abog{V_VqAMTkK#PRYw(kZBhTU*A@U|-gcQzGh`m37`$xD7A^H|#ge0)Y zbKoJQ5TefmNATW8_%pC?!9g5D@a{$oJc$r_2jKeUEg6$Pc(iNFlWS z2;4)TLr5Y-a?qcEB@m~0o|}WcI;0~c@{o>@#CaR=7<8p@9nHu2Vc=hea44=nqRtG* z`4}K^v`HM%_yUW2@7s9o%{E>yar72@JwW2Q65lKF5{aXtr%mMUeaOl!x!=Z~#9!TN zuNT~Icq-DTq&?zHi$`)nM2(8lXU?>f1T-ed9UqBkb#y(GO& z;_0Gi$?q&bBK#%4x7TfAk0;j&Dc?HLAN{T6trB}v636bfcvR$vOa8+JUnTjhmweX? z-Y9w-#Xe8)r0^1=zfJN@YPsY(qJ9&(h?K9F*pZNY6M}o9cb&+m1RpMVQuM^+x>0y- zT7GFi>!ltS-)+l1K!p1bKWwj;zhvV%62B<%aH;>K)c*h}|9Y{nP2#l@ zr-T=ic=0<{Z$#`_C-u=w{PUiauUPD#F7X`k(+v`@68;n^_i*v&9Erz@-(Hk>is+5W z^>ndso#;zRzx_(&mkU23=`qRgMTtGJtC#326uG(L|HZ;vF7~AaUm*E<5)T*s5#hz8 zUfRT8p2RWnyN+hx;C&E`mxZH?Eb_G^L?uq*o{mRil#SaCwsB-qzQL;-O3UZf)K=D1 zdNuVe@uvE++F=!q^Gc`I*R<4>)z%yr58{nY4Hfa`=KUL6Y8vXBgK0JOmGK1=7Pf>$ zDjRB`EJSUd5f4GgHEhI!>Uc}}e6M9;W4yF9eoSe=!UkhPI`PmEJ00E;p=n-yOHEyT zn4i|Xu(@>q`grri2BeH0mDb=h%F1g>4~$ojZ>n}mSdM~~)mFnZDCL2m)bCT))X3s? zK$=q4JaBA%~rxFF=@UZ)G*^IQCt_ViysqEVGtHbbt-V={IaIncs*=^$2!(*oY~%3 z1N$YRG~E0X8tCT?TA1W(k_N8j>cDSK8Rnu6M~ocn7YlwOv{zYeZFyP6(LP?a<4EG^ z>oPFQ>MPU0=urVeMfe)I1PG=Af=Kh8HBIq~mZ?=`6>(p2eNAn9Dtk*nwzvfL%&Tar zs)^TD4lQk{s%l2x(}I>&rVZ7K8}6qnlJgzlvo`GSs1;kvl#3reaQ zJt_#mS0Mn-3L+?75HLOoLh7j?8mBko$M`1Jgs#!u&CsRR@nU>!_4r9Me37!2hPs-H zW6OP@xa8RK3G=FkmNw37*$XYfPq579mWHNyqYqY8H&mcKxz|&hCpS#TkcqbH!(|mM zHS^=s8Y<`2Vzg0nAUw7Hz_R-4bc+Bqac;cg=-Ev*E%6CuO-(h9mYVwM@uudQ=9YLp zic#B8;c99pR$4W$zG6f>%CvZ0UBmqLInJo9sfbT(Xmo}av1KM2WaR{8m+msnjb-)w zSIw%gpsn$A11xKb*O%EbK?^xIUe-9FrlonWhNkhAm1&nKURsVs-%1~?k1udsUs>6{ zAZfEQl$5#piqTEdb*x^V)r_H*dVE@4+0pTexn=b}P+T&X*F#I2(A1zLT>!$(@p{)X zL44t=c}~*^IFJ{!Yg*=__S0TP(<`fKIc8{SC7OABUfQa8^#NgfnOQtu9~7sh<@2h1 zv()mC-&h!*!wWlP`4Gmh`5~yHwxK!fuj+l#LfL(sA+@-qdLDX2V@uP}Qg`qIZrSm= z#+G!;^Wnw@r>mh9G{I>Jg7_8&wXm2J2o;l%FF{UYS<}%K4Rv)`<7lIm$yP6mOR%_^ z-qcW4QyU*z>W;V#%?mjy`-1gl^$lFD_&__+{Tk{gH)Kwpv;cFDpFDa0Y2)WiKXCtv z=>e-UUOumSBE}rk;eBQh4i%Xr!PNSyhSK?15vGmxWo9>(H5!rh1fca*iaJYY($vsc z?O&lHr|s7;dx8%Xm(+Dw%OFk;5Ca+e;sG>Nf-pj{onj%8ct1a}b-%)pljz-jLU;gC7i4OsTZ>(h-4=ljGLP6|wv#U&hf#y2;| zo4696)YQ~~zF{Ii^Ekm7W_8z53WrlH6sI^Dr&ewYUQ*CJ0QcXji@}wpnK~vzN_#HI>ylQz8}_ zT>G?Jqcx=$FijYSXW=%drn){}>8wwhM)_Fb0h& zEIp4DmmJAL4=t@nA@;9IkFdohshn7}h4ee*mv?(klx@7=Fjr!N^RJg;A zO&p3FDreC0t)We>HMFj@rg_qW#)hUAr;E@I%z%yxQ)`tCEz~f{H^oJ#`e;Q%{rs81 zt9snirQ41nINmqcPKB9kEdF@Aqa&@wxD*LMQ%9!rEi-)vNV+>(Xi_^8kTeMks;07* z_>rd6zV>;TBFZoepr)q9Tjn;n6;NB%+=4M8G?xiF-5osyn}xZ=StZq0)i+ee58{}M zjQuP*m#59LlX?0Y^GEzxtU~6cdk&%I+PJgqB+_D_Bh5k+-N9F%PU`?ldzw~o^-*fa z51(6yZrV^0XcZXOxh})hy|6jB?liq{R@&0ylB${oMgf|9Q#@T}NFEr+Sm!J})6jU^ zmwgkEUj^!f{R*qVy<9!ky6SYdDXTbU9`3B_d|~v_X%i{!BTezzcv-VUQLTaHePzx3 z135N2rQu?51{(jwS~M_UU3o)8?MQgt2VgGO!$V8Uk&BO3SIlgxsjiMUm7?;}WDG79 zwN3jqOo2n?E}?ni+ zEX9tm3-8bccr$i_~5#HZC%&uy8``QA4JT|ya{_{`47(eZRM?I0O_G~I{& zQtabvB-GrDIp0ULUaMieJB73~G)%)HMeD_SF5P`G4~FhFd{gV=@k*FEuQ4!OBbif2 zU_=xwaFeR`G}KmFm)CXV@_IixZIa`Trg&9td;#_fTzApQfhuB=XE!vZD^%;ucTQR5 z{IdFr_#|7GSYS@WO^%;x?UO{OqUmJQdPW?{5yF|fi%V=rfmvz0efr2Sohhca!U<}5 z7}o-XaX$-dk+XX6Q*7p;lyv4lk>D;?pso^a5bFb$+z|>`?BD^59o)CeT8#CL?{+`Q znjB6_+Z;-940BTgmbnQ5)7%91*-Fenfej$jWPdU45A>@_u2V>cb! zDJa0u(#g)|qfyw*a6Fd`12<$sj00sLw;}u$9-D`cXKes zVmH`bZph55GkS3Asl2Q*yb*`IIHS*K!2ma*VZqQ+EEjx3xJchWIK$eFE}!9>iitRw zm!E=lL``LU!oo=y&^WgGvVpCw@!TkDpH$V*gc&_O^7=B8uz%A84*F$H>9MqYUhUDc zQ8>LRZuSj*y?7#HHeCWY@xIO)tqPytfvy=%75mrMc9@-Q5WX-gos~2pZIGXq&J%YV ztbleYGvX~Xp&%1Jc_Ox7(u-F-#j2jEyR3n!4HIFA+dQwF8w4%sRfi(!8@W0(hbH^D zEF^7K9(FnE+vZ@Qg$~!eA#xfDanWLAm22C*ubyqrEICU#wO0fdpJuCL3YJTzm-r%S zUBYGD$<2v4GH4iOqX<9hm-U>Lz2N>nN5>2%!k^X4SrCD$Ds)cw41``Oeok$dcQ zn7-2!FZO9VK&vY_$#Y#Wetua^EpKUkO;}Is&1`U!6boEmmCt5w?8?|Qph{>0W_m>!&7S+`3{4>9hIaA4)=CYZkJ+f^OB>8?h% z3RIy2AtM5C+JMG}+FI~8Bs zBkhCW$?)Mr%9}YmOl`p!i#2V!bz*j}W<$dS#zDqcG1=Y-``50`>1rr0;g0(hJauTO z#%>}W)nGN^Oro}5u*cfMmZrTFPI7XhJ-*D29VB!Bg{p?j7J7bYX|T`PTxZ6c>d}FMQ9r{i?XP zv1i5}rr4et$=x36*m6POA|#oCVL-^zm3$dVSLjOin34x1)Z{S(NeCr`l0eGK3y&mU zI;21v2{kW)goKdtAm2+PAz$(mlJNfjwfiaen&0P{t9#E{Yp=a_TYK%b*WSlKIeVN# z1)8h8d?-C*b_dNvx?liM?{|)|y*sFJAF?h;`4ufKsVs(p7EY zQs`ia1X(4@AK?5E@epP~luqU5#CCP%dPcY~dD=Fy4iIj4RZctRMG0J)0UR6@;?3!fwrX6@uMN^??+E7<}b z4|Q}vpm6(!);i6EHJ(X^Wjq`Zs6HwbR)bLe=s;_~!-Q;09Q zjWJZw+Tyb62ewk?XUHY(-qv$UYv~3?NqfeP5L#5;Y{$}}I#yR;^E9zxDqS^Ub!AYX z-@>}S0ex#F$>g-syw>uJl}s91TZZ0iA0VF0mdZ_5S z54&Zm1~?AK*OtVJJU5cy;VlUKAdAexWid*OpUia0po)%6o`K%XOoy(7ao=3w!qQd` zXP|SJ&W%_A;;~wuhmyK+ra3V)eXWUrDrZU1^)TLC#US>&CiDo_DR9uBuk0JbK8JI; zaB1SW(6StYVYxhsAC4&opky;4yK+K=t$4UF0xAI!=@MRGmNqkI zRN@MwSG!Zu+VQvlup*paI^DkBBiUu_&xQ#zWk5Wz&3=a4X`z-{o~8nsSX&%goOU4q z0Vhf2X)48K_OYP_H)T7RYYc&n8C4ewamruh1i6`3gWNaMxQ5J$(v{m`D~4%Yb_xs3 zOe3QD}mVE3{9G)Z4Ug4&ANJ@>9 zOB+UlpNC$6C*k4dO1tB^;kBgzCdPKbBs%6f{O&ckQ!aFIEzg7s^P1v2d*ft_sOqLOp7}>f;q_bz5NpzD< zuPwOg%rcc2cG2a2hT7cXrnqe6SsWrRuUx?nccQZ?s}JrIMEE?+g^d?eg%|=vkE5NM z%jqS8wq{e-63qpPfwnnwsRA`B1D9BTxD~-!Pgr{?&C<*dxI-fHryZ*HBT*ciqyvm_ z;?5W>m+T4%b_}c#(p^HybvqkOUTqVfSJ@_Q!cGWs&8bnTXRKxDo(=Y&brq1%6fu2rjX~i{34F;GO6T1(JGz~}HV`Gs)-YP)C=BbJ;Gna*7GUIxe+TOyb zA_S=wlWiEum@aRKIcNnB@{&=}1yAD*dq4;^IGJm8lE!k^M(SkyeDhj!A(!#nP$j6wB%^TALWsgiwWYFEI4G*D@n?}ic7`Dm`JF?_s**^j%I7HPytMEh z%`9bz<4V~PjpF+vn76|Rx*&}T$3d8Ef-#n^#nOo-5+Y5Y7NjCWy4Ws@E(9KjlirXE zC6M$!8rodNBYG{Q=9+y&i@r@}fL9!_vkC)~(V-b>fwR!&OC=!7J}>g%(iGQ2p@&kz zW$z$CE3otw-&|CVd0`WV>ndIsq`V1c3YgFdI&WV$N`Hs?_FR4fLX0XRHk^v@z=M!M zJJ0wv1Si|vWxpmANI=2SUq_S>P!OEAA?8iwk7QPSGezRa zqIU=(WUUHz9&YPYGE|3!WhJ@^X|N<-!bZcYZ{pK*o@l0zAv(BsvJlIK*-1pqjPjg& z!sQa;_~eNjAQOIMgai9*v6!89HP24+Odstr)gqq4Eb%CGM|&n^DcC}YgV{@($T5k| z;2aK+l+1{zXT{ho*ztyr*hjc#JU6=ED{$-)`%^IYF`iM-WiD{g$C9xmIb_LD5_={) zERh`47G;$flMdmDs*iQU5i#S3SUOra(ZJ;(Dh7VVv6dH=fj7^UZZ0RZo)GXBC{oWtnXIUc_->i<96Y(RKkSJnBTE#CfQ8cxVk?nkAgi zwLIv@g&7qD-vS2pJKJ95ylp8l9k)AJ@;Q+f;nE4J0UJbYQ-^FsH zgXl{))bVf)hqRzsY%-khkyCF=?I3CzDyuak!56M4!e@>E4;-qpi5-=*f#=&}Oe^}! z68gZ)NvNFmKgr8I5N0R)SDM@+a+1t=uA?9c5ZOuG`Cy;^R5tP9T$u!ulW4@2LTaZI z9G?-8ipsWRv(35YO3?5Y0!`($CVGfqY)V=HIS|PxO*rT3SQ4%@SJze?j6Ot!U#u$0 z6N)TETHam)3xoE(wA8$W;d+{dlXJCQk%_Fb(kl{gr=1~^v;GJ|@5#xMx()ZopkxS# z^`lCp5_tM|0+yVWkkOs~2_g(wj2vhE&g0sR86KLlDORugp|bLnD3VU$g4gFD`a+n_ zff9)YAuUM2HE7(W*>jfTETS%w@mrWo*A|c63*mJ#wI z8RLZHY=uQ&qfMv1U}0>4m09c}jRkEh-IwN#C7cf@5qZKHb&Ho29oHM=dCA!&^2~#o zVG0TL3PG4bv7GSKDSIf7NrYr6z|~}$<-`>)B7#0|5%N;X-oki<#Z3>YWWj-FWX0yf zj>4>?TZHAF=v)L@uB^^W6O>>@0A$oe8$Q60PiR1e$9j_+lO=!~%|PT6QV|+k0eY zZgg>o;yEFuHu)yjX1((p+Q18eIIe>e5#D0j0GybBU^ZMp5KW2@nae~xf4~aJ^cE~* z%=Hi8W>)FaeFGLXa0Y?;Zgd#HxE~Lp?gTms^Ur4LK;d-E>(K&J0=0{cYtOh? zlmJi6{Dwp3LFkw3Npe_ zICcaccjx8`o1HV_%W!m_p>y6%C|K?=#B%B!%xy*-`jMl+AyzvZk!i6M2aKHVL}nYz_L%ykMn(Q2=)W@j{;o zSi2rCc)U&SDXeF-dnJUGua%J4+m@G1DCb5dCLapouNFlxH)Pbavp?1IqDR08RLgY{ zXH}i%Tw4mQWj$oZEIF(NJ8_(K?Inv5=Wte!iQ4AbTt}jU&*9SY?#h9wCICl;mD4>dcU}zU60XsXaAs$&jDp!v|Musuns|P2n-F)XvsmaB4vzJ)<2iY-*VtOZICkQSOdbIYEL#+`%S*$} zaJ|#LY)O{dSJZ7}3|eNGo5gT(=IAJfRG`;dl64X|KNCvKMK!kMEnBRuRLzZyU8V;U zyK-(OqOS@G;B?g*YJ%MZLEU5s_NL4$_!jsk#y5m_>Zb40;XX)yzEk@C= zZ8{B0Q|SvZ0>rY?_a01XHZu`eu9`4VSMzPTt;~x7UdERS5w3# za)4?NJO%nWo67Yhc9WBcYvSDE%(D48gc(`!5HH}}M`pqEbG~wxr$laK;~()=^I?Yl zpM!w)t1$3Hg-eDhG%=T7i;U#%K&|Bof)JbfGC}j&BXa!Y})TTMFSj4id?QCrCd>FmxmVsoV zi4%>$UIC38Zfpkgi|Av^N{=B#ATy=cCuUrBdLX#@^g1q2aZh^Pljn6~-bn=U8wRfT#jLwE+C2w0nF4j7MucV-aCx({vsGS|JS!4-*oY z%wRS+KqM3^-W_rTV8nTQXS3~5e_4ngh!Jv1;vuJ(a}m z>Yb~}z>1f>7`aN#O<`QPV?COk)F+?S4Qno?HneP>*eC=e9y;AO6y8niW0Ke2 z`nZ)gLnO~Py?e3J=yBdeWizD{ZKdfoCla*g>Gk1lzRm^cgY(F*WRuTigJ*NVEi0R! zXD1u%g?hhqT9w*A@pRu7`tRF}31(p_8cW(qQwBGWq6HB4Ial&y-Mv zZnC7~4%}=LU@r0>@q3iMIQT2u&%{F5Upoq}wK_V#1Yd|VNB~~u7I?cejGu_4#i=rW zP2q1qINP3R&5xg)lPF5IXREhSCv_`@d= za>DyExL0pEGvoxD33O6<@dzH&Qg-Arh>#nrZbDQX@^!glb`hw5;gcl9J%K@#0K3+Z zvrrHkHiK|5SrR&K>Y4F5N#)_wJ7dI$9=789P-lwxP-ltA$l!MDDr$%B3Cm?=8udxY zsuz{3A#Iz?k_Q+p=-digXbDMWfo-+COf6rCA-l!F_Ar2C7!GUfI=WuNZnWgTdV)$; z+&W>i?%gj@B8balbg<18V00Z^Mvog6oPz|{1!G1VnQyB!mRjvvh7noGolIv~k~8$b z=fz<+cB z0K6>WImwc8Frw-G<1>!V<>MuG!wkL&SF2n*s-PY#?y_ZH1WbQwraQ;mn zEUir_Rxk!0SM#{(30DNpIpkUxv#1`!?Lu*uxVjGGD)n1K9QryGHFL7r!@f|Lx%m*d zLvVG9cd;|67F0!BI;kmAS_mEMtFB7saDKx*JsPgh9}PqDO`VEQBD=X2DsWbWsS^GO zgM^Nr&E_bWU@Ig@BmNblu}gs6Qe3YxwdC43AXQeHtBB?*Jk6nTxzM^Y6D$B{aXZK? z^Ki>74#g0F)m;MQxg`%gbkz&AoVBzEtRT=}Aww_qg*I;HXf3A>a3r zhGGXTxM|aHz0r|M2!-R}h;wakRXq>CH+x@jP6@N;$(4B;KEZ`!O}tqIS3dKs?Fx04 zZ^BAoArd(~U?Jiwb~AhkcXN=-G!&VV!44e3aU$Pr6gFy>p1tDi#t`hd+d|@p)7BR1 z2$gtxCv`GaHQDI1FpmN|kt-ixQ|jl0+Z;i**TdDHK)|f!8=bhZLBC69Tp0wmf)E3V z%VS}^aT75)rde@q1j=~|+m=_s6XICxGgU~a%_fORq{EedV(y$8eaSM~8Xk-4G zL8w~L3jRv~d2KOWDdCEW(8LM!Sp-+3i}|a~CTcYS3M_KCE9iQ}#b?mDTy)?Dx@Li1 zi(xDv@g7X<)5581F3tB5BZ!-Z-yFMb6W8sVYYMuyaZ$_kl6q6D3KkgF2wYwSV_72& z@tT|mz=_oB?v<}Ty@xkRV5PfvaHs%a+=n4B6{i)#;@m_Qee-Ob!OfHz2SYhqS2$6Lp@a;#S7s6yv_-54z)X5#&V#g*D2h&6pPnZ=Qo{ClIrBf=ogDZf=^%XJW>Nk8>$)LExL8U=O@7AQ;lkd|uZSO=0_WQderiq~=S2wcfMs z>UZuOj#v?mD=yTSHf7LhC*0O?P$hut{o=5y9Q_4uc;|D?OpPm~5i-w9WJY*tRLI)C zl@nEtC19|WwChG1YX(Sd^5IvICS)wdpL?6UyC_-;EVc{0#o#55fOuO!)15G)T!o`sogfvYhviUsb|j;o455dz zoNO;hL*T{<9Po&*#huN*VT}nZ1=E9wt!G*C!F%mCAH54q`RGN)39-zY?14tjTJb3uXp@U!$GCg$c#F4{Ck0fjV@Uaue4?K`+gX4#fA31me!^Tt)CzJ3s z!OLq`;M148|C2BIMwf?8&DIV5hYoJ}a^TyCX&wQzPdII~+VZbdhYF)^umsR>!L!DD zb)+GF1yQq}oN!z2>L{yoW2sPSmxtcI_6TMqel1yMTm|U8?|kHWmP3d*orgG;hnN`6 zVKwd=ILu?*h0ItT_*~Z&Eo_YY>AuqlZinOvYzK1ZmIXG!4V~bma|q5P_xE)@^5ERH zgS%7L9xRJ*c;ea-C(c`Yh!I<-vv6GDwJvTqhJfHqJ33M7b(c0dkikuG{sB~Pa+t#V zuJDFGn~am>6js2CFgN^-Bf8YH;Nq;$LU1XU1s7L+7J`OD7JN}{9Au%4>5+vqPW~*M z_4nr>sZ;3s&q14AfGo7#5XeFzUqoNny2hi_v;{ynO(bF5Q_13`wpX$+dV?gR5uwvo zy*FQAuEthH77Mjck%^I|R2D{dIJ8+TK)Z^QIe}-N)%kBzra)eZWXBoM;WtCU}DVhprvmN01d)&z(Dry_g?OveDAxRWYki|q_JRnd@U!> z&Q`WpmG}2G3B_?audROP@(R zr&fpG@_I4rCGq#qEf(m08X9W8)Hoc5rWh}f2J>C$X{d^)5c4p_=t^t#8cq}9mBlHP z1co^93l6=|G(iGmz>|;?FTcTsuQ)M@>mIV0PKn{+xSF(A_#VuTN@QSoNv(sLL6s5{ zjR40pt>ZLTbA4ou_PqB|nyWuN2d}#M8T@pii zm2T2BSOUq?V0C$R8oqdG!gfx);sYuj2MTbJ_e2=qgbTIo*&K^Z6N0~;G=de5XM$sy;7%HWcX6#4NoiA?5ACV|FT^@rm9f$9t0;>rHaBH_4ISB!{y}WRr-0x}dp`d9K{G)P+bks4`oFJ;`W@ zOaj-UN{w_UqOgHm*l#(@>SAt@ED2_yo1i+wot;dHR@*nxNzeN`CZVL#(PfG;S}HRe zH6C*LD73jQD3gONu?rq(*8l42~jI%HY<81Q%q^1<=h@V&jY|YY%Bx- zEMZ+%=xoi$P&`DZ1Vnb1Ywv!=7XX(k0rchINq}I}lYMFEfZqyfrwTmJk)D)g?(b+cOd* zk`#Ul%`B|( zwN~e`N8q^Oiep1Q*}hC8)_eATp63xC`#jO&m3L>`xbn)RmiCgP1yGeL#?VeHNiZk2 zBuri^kpzxQ^gt2{O~@KbkjehTMBoVh^+uM8PkTjeP{ou5=MUP5|R4UEp}3S3#&P}LXL z7SC{yxM&|% zcpiH~Zeun01)SgxAvoBHBeJ8N^XA2bhSbX>OyMEMx!||?sXHRs6<;uDeqU+LOKS6sNEa|V-I^x{14O_e zf~u}!_m08c28vfcpRo_v1h>C|IO{*0@*m()(uH2RvBs=%)mU>DTE>7E*A`B}VwpdL z4~~HwFt5k$v~c$E)D1Zvc+_HiKG+I033N$RC$LaWoGJ`2-Gqg6O1v{Zb)qUD27FHk zn-8RE!ZP4SLR30L^~zw1cJKhpXE^}8idcsfIZh#=ErRjUL5GH^qiawRU?Q{-Rp?WG z;|0el*-3`k8HOg|nP)Vvyp_t~lFuZ*P^^hR7u2yrXOf#aQjCd-|8Sy13 zJUi(W)1qlb30<_g<5;=)9MAINzrXb)~m&C_IjiL@*^T|)wm*%8vAdB&Ub z7-HB`ghk>N1ue|ubHFB(0mN{eeXzT5-4K7%XK6D>!b#j>j@#06Yf+J?_WP6V1L zFU;TL=;7`Ay&nqf)kAz0Y^Mz;m6fu&|l`3 zuHndprenI!sT+xgmumGJoP+iJ^bLQcI*_)q4NDAjmRu%319P5g1JR!Qz{WMWMHzB| z&@%ppPGQk$MHk=mBJSZh<=S48se7|^5fwLFPSwPDKR4KIjoN5_P0#(eL|>G}e4xtZ z$_%4rjNAeYH3(n#tBt`Bp(G7@qI0GjhQ5p6z=Vo{G+JE6DC}hlrWPlL&Uneq^EGNT z=s`8a66}I`MRD^xzJeG>rQs;9F21f8I}SW1tp&Wwczjvj;B~%Od$`W-B@m7_iHA_< z&4aSS&xWn4dDrTUBLV}PT#1*~7Z#pXTjnT(5nB<|+@S(Hd#E)SX(q8XkN1JL@ADf<7Yb zBt9llIL9k2pMwXg%;%I>b{ZaMQNts=cs^A#UZ3!4o-+d)2@V7Q01Moq2A(XCMI_2& z;bCzsI8ho4*M;f8B7i+c%~w#r#hD{NvE)77M9_{xs8_gRM}L9=sY1X5!D?wuE;t&u z>~Oprk1r+WWzTSdkYKhw*1Fc#X>lhVeC3vv_e+MR@(8g^l2l1+fE_G4$k2y!htNQI z+mHH<1%Uf~16B)fSCzEt;yF!)v`R?{Dk!Onun@Q@t_Lz@_CP_wJ-9Bt2eDP)!S?R= z3Wco`QvoTsse=SUszGcq#7PaqsUVVr2=xWaPxfxWvlj)pcPGithqm^WV2>UYX5hus??pND7r`suS{`-$v+ zivnT^Wv@8!xFf{VJmGvl4=pKjPFk`dqaNq*t{S*35J+GMApBArde;K*d#OEyzlh#3 zMCwKf^E7f5P92M*|8#5>?^`5c9~p>hbCg^N3Be8LvXmLYY8$X|CskrwJb= z7J{MUy%STmzWvC`7PLDsWtL6mQROU7OYNY;BUSKBDL z6u5q^8APTA%%#xR!q@7*tB&g>zm z<6=0(H?cZ9a&>J9VQoA>hV(0|9eNUFH)sSq2nx~ah}YFn%_2B&W&&Gu@S{sY<@TZ0 zl}F|DyoeiWbPC>|iPOTc)tJq!II}tZ$m1kodR#lexpoTle3%kmk_&JWURBTXGvEOg zYsHZaPEX(P(mu1j7O-k9!Po5J{lZCd76$Jjv?boVpJ2T5fiEX?Qgb6z-sRvx$|vm6 zoD?6K51zi#fwE$7A*%vU525$Y8iDmgP(0;46>?E*xK~IXurV?{>s0eNRhbh7oYj+& z9{%FTP}C3@mI!j$WRuc*JpU~`0Y7aYTG)(%l_ZG0`%OLU8$y>)1O2A;i5J@KN1>Ke zOceZVYo)XLFs~6$5zHAB?g7^&UVRz8nnH=H>`dT>=;oQ_Hf&LW30e$T_XtOaO(Xbm zzSP3uv5+)RE5J;mI$Q?W!4*oLk+(Z*dXf_awxDpQ*61bN0@Ip5qKF-g4VQ$0?u3Fd z$i&nsr@G09QS;MDdiZ*5W!tGU{ORWxTS2{7<)5F0DL_%V|aO z5NE+u;EDi^tP6x+hjJ2WDG~BS33sobK|7Q)C-DOt)lg{Tjwr~ zU%E7@5Lj^ejbpW;SE6Mo*}s3{+P!Z+cS(TdO@h*BN42E+D?a z4C4fJ6dD$xmqLnY7$g?+$cU&AQZTy+R4_|w6Puji+zyyJxE9gcm)u3f<(ETaJdbv1 ziHFG#IO{VDt7|{S;hZu;Q*dmr&10#af{Wpmf=Ij_3@nUOQ)V8wNLog$% zOe)MYvhWHi7_)%beAIlR8o*IEUIO9sWPo`J%|ec*udu-Fj#953c_l|Eh0jx_$4sW# z?d?j~yw;k@7H6EgI+>+uD=4CLFL7LTy=AaKNJN`g2%H(cI5|FgDV2f81FaywholUS zM91o9i;0^iWo)FfU>PV`a(I(37L`OlB(H8xW=xFq#G5O$vS71k4L;++}jZvB47H|)~i~*`1ugE2xnleG6 z$6E$rfRUW=ha29w`O9YlDB4Y45&{8T>@-8Z=v+~(4TDkWUYg(@6hT0|RNX8JGcZ0i z&=ZO0Q=J500`I)>*x=`LY)qGOdpswI`to3t?UNHDqoaxBBZ=qd%w+LniA{RggET^i zJk}Be7mB5P{~@h{DY~HL=w#M%1aQljuNWKBy`1Tx0VG^4tZwP6o)~gTE;sQ_EiNN` zN!~c1i1?^fdE(jYAZM2u7B?r-O?bZ*T)^t*g6a=go~zA2#}eK@TpYC|ipfE7c=@@_ zl`Dx|l+liwj~pF-Ni0SHIq(?5J_AVD`=p?VNo8zoNN2WEg2Y~V_0R))!t^xFjE!U} z5@^&UBumhkoqfk0-GAn)EPFjU5X^(uu&Brn!;-lKaA|J8lxghYJf4#FP*?0h4=e48 z=(0p(AQF?+DuGc6l!LpX3K!X$N)Ut3Nd~`>6rG9F1~cR1YP)@Yn%kOuz;dtC1O{HP zE4pV3XbE01mkr200<6SPap+7cokz#xQBa(KdqC`Cy8f)vYEYU;_vmm2pd9#6Nq{-0 zuv2TT1w^CU@P!PFY=ov0sIiwp&z-jsbz@vkD$xuXDdh}A2Hdy69D2NoGtV=W{R#`g zEj_Pb39QA)nFkb}b1Eyr&{=}L`wfUjwPcZr%N7ben-^i7No1^-PDj2w*4meAiu25A zgzz$I-=?9U=TyABNo8>eLKQE$?CpslsD)&M^p;2PFs8oT1zRc4xmbpGXp!<7vMp?q*>I3LZQ}tQG zg!p_Os?5DOC8@IbN#~VrtE#{ja-oelFI?0pHvmt-uJSq(VoDddUN9AHG-I2yCcgN{Po z>M-I@&AkH9ry(wPra8AJ(#jNgx+&K#>+G-+Gn@mg&Rt2(MY(8mo3EGb(%LHDTAR#E z-|p-Q64%88LTo-+78$I;w)|MY=GYfwqDziKS=Lt6{YcV1`)ZpT#$I zOi}>9VS?LvgpjFV#mz(W4XZPGL$sW^m<^$O_d^E4F_}od-OzA-g=p+y&0OVqAlQDq zH8#Zhymc;JD3F5}f4 z37!gQ7Or_*G2L`4F8T13({xr(0QPR(+cs=}!j#>IqeU3&1Rdr7Ow z9#rF5b=vCiRNe@zgY+P96~}Af5WjH~dEqVFjy5w#-TIlhF?PV*(uzEo#L}(kYD8$@ z3YO_SS)`WoPmD}2udc1g`yUc{wK~%aT(9QUq;SXTxjO+oBXE#UFW^qv1R>t6G~djt zaGdp=x!SdJcMvR`&pc5HVmhKi;p*#J9Ch9^L8DG*c1^@GIT5Sb|FdXWVuC0zn)4u1`Esg6jz)g3b-Yq>Ehv6^E1{tWCafNkrfO#qS7%}|6|7~37N%czg9{?O z-6y?B8SOmOUO|kroy8!H<>Dvcrpfbz`4_dwd5G) z!V9Wc2IE?Fwyh}~%BwK$!NU=+>k{(!X2-Y^Mmp;>ZIyqZ6o*yYR*M=vmOTPtDMi9D%Tq350Ne#dd*+SSi-<*(>)c7EB@GA91Irk}bn#|i@4W|SX zpRnfal`B!TYSo{pTGz3{u@%xJdXhhE$-t=AhN15}t3S^v9kI41>apm1Kt|?AeL*xE7!*UVN-Z`b1hR z7}c8$O&5^tMY&}PrZHXR(lk!2E7X-kZs#Pd22GwNrO7Q*NToJ1r8KCnVj3bRXDFA! zX9;F-sp=cooyfT`!!GK2RFWd>_>K+>f9{^q8LH*uoP_upE3L_sTMa6=QF_(W1kihM z;~6+CQ_Qlf_F^<%L$%6-$a>WwVb{2>$KZ;ijrQg?mYxoBLY*Sgq-sKF~Y?+$q@rA$k`3#_BE|PR5q)xNcP07I49S znKXHI)15O;es(8F_Ld&xV(jGgyspUEwxBclQ`KjQDMnI9T;RO_2|G36#ui4thGeC7 z{YvUL@DgXytJWw`Z4KjAdW??M=CC+ClxrAn&#S`>h~kf-5eYX6VYnR}&5IZqd(jU< zsBkqC=qKzEuiPZ6poLt#(ib5buRD2^k)9z`cF{u6Lz#r!dgA42D{^5E}tc8QrzwxFxtPbSjYG{^yGnwM~Yp*mip z57{KavK>SdE)yY>K_*7rMVT126!%cLQ9ucz10b?dqdXH5jvuwxo=x7A)8@db0b@D~ zs?M(xH6BcT`epQl5>|6LNY)|t;ubL@=TNLI<7{5jjDemDf_n;<=) zCmic>bQZPPnrp$f$|h1LiG5_NgZEzhfCNh&o93~@c7=pSd!W|RH7ZKXXzPdCO zpP`im*Ab^Ig9iY6{4&Y&H2Pm(#({R_?0nTgf0G@2^0O?vg0K3)>z+P(yaKE(!MA+H^ z%4_Wa?zeV;V7;p*4Zw*`5a4Vl2%xSL1YoVM+yrX%#>6TQ5d_`qbaQ4Q1AJz2c@_6& zrpV7vU%}9ZXDNl@ILH7`H0g&*QI9UoAmoK+h(&9HJZT=%ef5bICuIo z;Lr*R8gvua@&VXu`2ZfYe1LH+AAnuU2VlSD1BBo50m8I=0Q6cufcq^UApDjO5w7I} zxM}$S=(l`;@EbQkBwIc}`Yj(IluFHLHQVw5x!3Xmd=xYH%IXA8MkYF{OkEjpkv2{4 z^9eHW_ylmrCjg@-vfCwu!GVbkDAi;J*s=&1TNVM-u?WH9APUr=S|bNk6F3rs@tsto zm#(}7rcF=+fOyGdf|PDPQN^6*j3G)O$4e5%mQKQ0cppZ0pmTX^%a%PzFUysh*TPuA zSD|_2YEzv+$)DmQlBS@>d`uzyDL;+WCRPgJ&!Q=$wJuT^JHw_hZjMc%g6TAc)e~w8 zZl=@}!gS~q!WdU6gf)Fq7;E69FwDgnv?;VTTT&QjxTH{4p{FpON>Aa8_D&(3{!XK0 zu1tZQYD}S|R_&abLThE0f?IXRVKv*H!O0aF17K3>MZ9@tLhKg7=>$fn0 zuZc*nym%=#s4!5%ldZqL8lv9&!gsGWCtQWM4(x$p`l9E%e zr!$Apxa5hoZ2Kyl7}wnN!|G9YBg1pg3oQ%}UWCB>P1_{v5$`OTJ-O6gy0O?^>jcfg zD-%@wT1r&5lT7X=7gq`dB&(O?q)|*|s)Az7@ogNoJdOqFI60>|;6*YkxaVqS0WrYh z<4u-kdKPz@WHc;U5|fvk-sMQMJB{$A%;JwB5{ze=crHrM?Uwlrf;`%bP$Rf`|5`dZ zL*!v4oY5~pFvqTSHm(&JQkBXZ8U|b3`mDA@B&A8Xk+~+00V|Tac28|~+XTEZ52gU` zdQQNM2ay%R5;kWsJ6mQ7A{`)row5qer*NKj$4#XTH5SuA!TB9kv0M)tpMh?gzj{zJ==1kNpzQCD7%$Lm&&EJWCo|-puglLxyPNGpENcaGkMAhHu!f@89e7M2lLd` z5AxFiaWvk^wB|oJIT%KEfMm-1E_;EPo#3~WqdO@CF8@(ixTY`|3)i7Gy)0cWi1X>J zE#fqhwYjOs}LO7pek@D z>CB^Ud6+fQMIOmMgKaNyB#E&yvrA@4dhzmB*tv2#nqJ)WWi@QW%mFUKdPKeWoo=so zx-&Bry*Q1rWxCgyCAleHxHL97mZxQ_s!PEsgGu)-Wg^7c3RzXD;oM~yO7WPxGLOUx zlEf=mm8l;%WJ`ktZ?MJ7B=gIm@VyE^gR6Vn8H!$y$@3e? z(R7hU`h?rI&gW)=Q}QX)9(ON%7g?kg?521=BTLeYm)l6sXXa>nadW%x`P>{$7j8Tq z*u4vl&OH;ZV6|}|wUV-5)y{stAPV0_2w}^4rMqr36umgPpn`mv98DK)Em;hy{kC&! z(}DlW$EjH}KQnK~E=x~H@f}SUfrOHdG8NvEpQEGc#mz-Vxe(in!&$v~mEH8jra0hA1->FX zl~ThI<~qYy!`LkYwV|tHUR>C^%`uTqLI-T(460eRg~!gQcP9{dVxD+HK!R&vVDrqm zKl)roIGnw*ihJ-<_2)?RuN(#@*d{a=Tx#OaKXal>Y7XnX)arhTY|&A;rEaw&X;qsY z%gNp&Iog}#NN}cfIzm z)|;r+oU*WknnijJiEe?EA>vv_kHjt%k_~t2d(cddiTgT75^_noL7W&I57qINe&pDVTF@(e(19uEC-a%wQr#L4>-G6QxwUU22JkeQTyfn1LhIwXaz7M55f! zsUuP3x7?6g@c-S=4|n5x3?Dv!Q~!ITekSbKHT<5aQ24t3{V;xi7e2p?&)4wT6Bi2O z_>g|4SSUQbR4Dudop+=t&^#P=rhhfE9j{VXl#SMhur=|7Kre*?Tf zis!!s?s+K7AAsL0@%#*_?fbP#`|qx{|cV`{Z8DAkPOO8`Hi^fAhEh?amZ}@cZc{e`4iO)ab z!#=TRgZh3MzJC;-XX@ua#P`4BL%8XGw{BGOJq_PX_X2#s44-%4^QZVw-jCp$^wB2u zybIq`@|HAiYHT?g>H+gN_toV_RX_=0^*!TJU>)^p} zrX>%K10y%#|9}3SK;Go_2);jt&pWmh3V(&~$8J}7uHxD7zgPc$AMoFX58(~KC^LVL z;kPOCFXA`({sq48*{b>uX-4t8gb(YM&#W(gw*lif>z{SXHsJHu!Grm|2YB-P3ci0G zpYk?^XS=c;*|v89Mw;{ZW**F!&)4y6+Jrp$?-M%xZ*7Op(7zSto8R0C*lBzy#}DG$ z!1?_{pk;fTKH=k%zn78r@A07wdv+*3r}X!C;QNR1nZ}3wnAfNAn{qO5%Ea`{k7M)( zc#!|UXc|6myQNSdKk_pClQJ9y4cmluz_i4hx_A|Em+>+6O`bo7=g;7CaA%?LR(yPZ z{|>mH-$#I_oUE^8Ju%&^PH)QR^WtyQZ&*%_1GWk4m2wzbpD*+Jf5DUZyLP3^|02L% zjSth3Ho8smWBCj}eiv?4&&-dq6UKZ_A}!_k624h>QxC-RAIr}&tEcqeU(|X3Dfr)} z^LUSjk@_~s^9sOEYTP^Y_muwrMg5)R{7j@{f9HI|He;V)d$O%eTQW@xbZ^AR^!*>f zZ4|_)ML^`eB(_S1cdv;GOvX zJAAh8M!E3)Aihb@GB4ma=_xzuslQnd)J3dErhgY`eia|`s6a=v+<%T|zwXJG{K=R6 z$&>uahxwa!VIG_ljJ_xT^WbUPh5VTh`I~&1AN!Fh&nrN~bU%vkq@MUsz}OF|8$OHQ zl!yP=PE1cZ*f(#sU2e8bC?oS>n^3l~JJhp*6UREC?4}RjqiLuY%s5V#hxJ0a*`DM< z`;KK{9*-eC(;0pJ9z2tda|qj$Wn~+X_G7@2{(s}+=f^aZk?q8^Oe6J*^sGPjZPQk) zH`4|ipQQL5!Z&$PHlHt_%|BCKQx}wF66wf``O;RPjB9|A<{kLH>rTbfe8Cee2CuO6Y zl<(7^BadV|8heOs$G*pLOj%ghtoOGg9rLAJ%=2IHoK+^)Pm(v~r%oa-&Zp$d{8*n! znK>?49wRShXa4**jF+shbcRMH?EO22N-*4yy!uurofOkLO4uZ}U;>B?yrAMZWG@f3VAJ*SDN!{e_ zxl{R=mlglBFZo0?vnJ$B?KQ=rUP1~+w@PDZWS<})Q%a;Z#i zDuF8ew~)Xu#!clQ2`FEea+uaf<7L;4A?U2GUFmcup%>v%WZIjmJH_JlE4VPNJIyrD zN6btux1}Mv)6UHEMfVHci8?nHSEsLZr&$CS1l(tiR8vpPj4wLtPPK?@h8L%odl2E^ zR}YdIT-4B=3FCfnD*e%^_FRuDCFNA7xj5aOp)Tm5?o`VwJu7N?jn1A>USAQ{dII`3u<15oEcq3vCm7Q3pue65o>A`CTp=5Y(P7kX2na=fQvxhES6uph; zs$RMq*TnV8v9}t%igQ!#c|>IQ6dfmpdPua)_jL8-)4OChF`6+FZjOpKr{y%U(J<&K z*h1(bH*#C;VRulbndxgyTu;)S8C8FGibYJ7d{akP4GY_F9@cJ8Q$Xl$M!PHvGpNU# z&iH1u>0<9GQzj<9lAuR{aStB0(tC8Vr7O#=<>nOsbZ3VJ#!YGFrRM4~PP%qyrirE= zmFwoa)6O>MOwKoBb)e9B%M#m#ahnj9FgWGkW8z-Ms|#@HQFr;Suiz-*6z2HuWNg=- z2J*`FMV#{OAr&t}g80g8x|u4`3A(JMyqdX*7U{?<3c8Lq_LkgLugwia3#}_XX6d!n zxf9*1w$tRn>h3f;&+bH2HC!@vr<(38-o)B$7FS%~1Q`sTnT3^`BjgLoZh}(x+MA$U zSv?STqpTIG-&#SR%Ob{08fS*pGH>|WG+ttvU6s~ez?+iUb_*Cn!yTMR$Kl&=A%*OK zXZFL)47vy;CVFRBePv6aNv^NtE$^i4UB<7%cTJ7A^X1f-Bwoh*Mze*p=q|%oXu6IA zMbS+Mwc5k2cD4vW<x&X%)jk1gvlnb~DwSm6};HIAMf``J*)yF#)vG9<0l zc8*8DP#^>dhZ6F-la^&JmyMKYZHcF-yGueAD>rgHrNV_K)NsBXWdznfyY9K6@^Tyw zRwJ-#hV$!3Yoso#7^SkhsW-zTUq2ZNhOYC7OLnOYl`Jj~AHw@4y8B%XefJrPmtG93 zi{-PkRRo~whR(MEB>Br&Dt(kGn~iM{-0{#OM@x$6R9<(`RZqk8pmS%K&KV5v9AnB- z;YCq5L8i&S1 z|GQxs#+ZY*w*kQTgr^A;MV`;i4g}0JLJIO8Ot}~vp3A8K%TH5HbunL3w2a=IZLM@& z6{Zp~qp7Y&NSFlUeW~50H-yx4v)>A77uT(2Yeot?$1pC;l1ta%0O_)DX?KQEE!oWi z+#EymGc5p>uxovSL^NP718BWm9CPmGuhznKsX|b2PRr@&2HTwhUY~Y7r#pf{{uTs~ zbSveSj)Sy&&P?8`c7-Ni6F`V2W{g}Rh+Gq6vR6iYGf{q5z??YTO^p)Y#eqmPuUyKO z6BZSEFiqMP-qoAaQw@=Ry;yfnnz#p1b9yCDgK|@8Si*=iM~1NhVcz8}&gB(c!&t$r zPCquxt>D~Yre51+NF{PQTkr%SUPya0bSl-&P?|Ts-V7}k#@KY{%c64zpBC1>slR(R~`C^S8c}?TpbNPibRhPyVhga@2(CD>q9!oH#*)7I#X?T&;fQ zCezH#nVeiY)*i34HM5EYNX3lV+V-M@jU(kJmDiPTdCHE)uJY+!cdXyD6PYy{I~%3y z<-T=;ai!7duU_7==f3`UL)0H{9vO%aMdf(iUFAE=arxPe^JP56@!j#xef9mtOO5eL z?J3W1JY22=9@YBF#ew+FZKYc-MYUVEuPd(a+q8Kd;=$@sCB8lS$G#Zn7T#SfJt^KD zABlHIXREL1-yJ^^?T$YdRsUNQ@2~wyMDmkye>73*FTTGL-x}{OzOz(_2VeZNwW;XE zhw-V)r>{_Xd%f`D?Yp0{^R~E8{u_)l{@b}DUN8S`iuvC*`O9CM`RmrF-npYxFAntI zS=w4sT=d^Zs?Vv6SI^YWmY!C*zjR>BQ%lF=6V>CTt??aw2WzE){td;gao?TQJp+>W zmdY)qINnqNENyK38YE&szi?z5E-Cik` z<65;^Y4p|4^;i4;M^uP+7QhYs@KOH(wxMvK92eyoPmKp(^o-jJ@#~{P2_M~QmYC78 z_|CXo+)I)dJR^E=@EN-c@%MlXA5Hdhl07HBGXjHlq1G<^LUc=f3#z7p|JX)Ro2hSo z#;!sboaAQ?kGu*9DE{rYy5Z=JrR8^lCSmh_kqWw(L(8uqRK#dOQl?XdsL~H z*Hs3~=$7RjmAG8S=fhFqbI~28^6ODM>!WR`gKAWbOT}UhpJL;60)UO?nht!WEB5aRQ}B<{#3Lf9;j@nZY}or_2DzBnr(aZ zjZ%!0J713C_e9ZC;&yzv2-H3C<>+wCG0=#%l?I9|GI8#Ug|n)t4$)PIjuLW9NsP*nUe7QZwg zg})Wu<3N!G-^C&qO>tTAbtz_Fu}_M5%oOuyOY99_jN%W*@jXR=?~b1v?L!gK8KMg) z+GpZIysuE(S2$L#P&c7NM(BpczD5Z_>Cv5q_>RKh9fe!KztmTX3eg>f_`jD5=Zk2F zqVBMj5<7Dhkh1(T-MV7Ccw8YY23G&YGgI@wS{&7wUOmMaE*uDPO+AwiO$C}7p-4wc zQWZQj*US%g0RH~MWs0s=Z*Gl>yASi$ouvUe@{9w#5BfwE4{Efh#6v(c|3I`l@ z&wu;{e5nc=o4TTqtR~%5RBIY{%WoFz321I=`IVQ&>>WmT|5 z_*;lS8W$d6E%5^+81T2MFGZ*dFBu5N{9+Gbu~>g5g~6$BMM3dd8LF2k45~uXG6xZk zy`h9&!aj(~h%12WG}2$#8(4{jT}+Ca!UO+933e5p?87){;(sa^PO}==P)feCR0km> zR()M6LEtQbfva@piE@^~A_=A3?8n6TsUf<@OQoiuA=IQM#-%1SNoN|I9l*)RMr1d0 zSjUBQ>;{%z>Jc@qyN(*!%vWmG8 z|FQR}vZyD*2@405(h3SkE_`PF!W6)_`41)8u1X@~qi_dHp?=1t2OoF_@J}z4o?a*n zMh9?WqqL{+x@e^E^v&_+2$o{w!8!ZD;&DFcAI1Ql8nO~1MFFp~K zjuZjAKRy;AEqH#L<+&R?hr#nzQQ>V7nf8@xFAA8p6;GTjP&_dY7H!A4 z$NUvnZ`9s^N$g1J$c};a$G2GtzA6$tr}VuMB{&e*A|wOL7kDh6A}sF%%g;uIztJqK z?~7`fg2{2iK12ifKQev#etJDxxvVQ4#%gOL03iA8>o12}*b_?W%5>JX#&-TURSq8?|!vmbf3* z14iy^O0~~c`acsls$2VuedWG#-1m{V_|dp8s{LYI`zXwVzRJMJUek`h&0$x#R{Dt| z7AH?FABceYc}~v##S@icc~hlU9x0%yVJ;QEr&uZAE3V_IUU+A*Ucgt}z*D2}-eRMG zFLbomMYX~Qi?ss2ejLE~7C>$({ABT#0>0v{c-mU{x#HFWzT$0o+E(~zaa#dj@o_vI zFZ>#;p+g1yh#$c71BKth^N|96V5A(Bk@8UCQ^n2kUJM>RR8F#Y-Crsf?;_D*A$oq{ ze}V|AFusjzv|+)1$pfLQ9Gr?@ycykP5TBz{_aeKy(N(@LD*RP(yY#*CyNb27u{AZ zZN9zHzZp%X{%br5$JEu}e62|L?D#?i(9w8jbh!|h4m>mrIij8SRQFcy*}Zpj;l9Dr zz&}ORuSb=Crg<1|jH}YW*=f)_sF- zj9|tyw=ZC+^H6CO%c!`td+hdTcOO3E@*NjScRp*==$oR#kJSfh$T#}GiPcBBQhimt zuDq^_g~Tnz9mrsNeOq;VdE5H!)ooa1*HHAq=%>JUJJzP}#`m4^rs#ewSk`0tSVhs+ zSE}XPkl)x#E=6N??{f!!U%V6*-W)wLQ=i>Cvt#!8g(HI}%E!y`hRWdJ=KlI%?Q>gT z75(X!Mqgu~QEt3pYq1LC?`>&R&eWtn{s9^8j32-XqJ)!PkD#*l#yg_tqeaJFd8q-` z-y0Pc?usYljjUqTY>#m$?vJNAj!I8N7iE2Rhy1NS9>q^Y_)Dq2GeU0|M62wm^;h77 zDD8+FeSKxg_mw!_TpGlp>$cju>K5>MRW$xzpquOV&**<4kGDsC_5RIJ)8w-md^R-7 z5o}`qx3L^=i|VD?4@Pw?VpMs480EPSj5n2!*7jAA)!QSKiCyAV@gv`iqF2Rr`MWHC z_sZYLWBK}WBwzcG>;7kKdhp;IqvD&Qoo|f#-W08WV^n)nw5_kye-}O*Ur>Lf_<{!> zslTxPqT&nDhohq}dQ0@e(u+>Lu>7L3{T#+~1Ge}dMT4b!r7~U`tybgDl%-32tlU>e zjjU^IFMg?7{FCZHJov}ezAske#^C3wwa->d)k-|@hY{AhwYUMrI`9`!=`Z>FCu;Q% z)QUgENo3<^qPu^vR{vUD|8!jZR2+S!So@3O`dYcM0b`^3)wu8Z1CP`NkovMtAqs*Vo~?ks4d~mS}Tn)2XfHEoJ-J9#^6*TTZQS6bGRo$M#;T zp)HjWvsZHh0rFG~~Ff{wOL7FOjP8F=|F(4atoLe1? zeh$6rHBo6V=022uAK3L{rYn{^7$;vtul@T7&Wd{K@B0+uJ@`5f;r=b^EBD`x%6ObV zZpY_L;Rm3>F)}Na$L?d)$L9=cWBJeHcC>uFeOsaOz0oU5FaPf`j4xPfl@0Jhl{Z)7drp*} zRB!ZG*2nRGi%LHp?Y^fxv?1mk9&g!DieJ-LdUfBn?fo!4>ivzAo9i3O8|!dvDb4ev zTrr_0OJnhqqxsUlDlp%RhJ=>{=K2p}A}WnRD;6sE6yA&0#|UHV?SO7At%Go{iZ93z zf3+IvA5r7}kIMp_lE0_q@60!&gN4e6qYp;Ww@0--zZ1)k#-4wLzv$(M^uyZ}y0Pa> z;a6xWMe(WH8r0EB{AgtXU1?<7`E~Ku$>N3D#qx#vZ^qHi+F!*Rzfy}oQb*TA{Ugm! z*Q-!Zr5dc8+6F*t#ma`_#v(q|c%ZK|Sl(LP5tr-I@b%m3e_b#BO?~IR{rB~Kqc%8D z9~@}+KY*G7tZ>!va!B~p#KvUIW z8Dfw%_Qd7B>R_dR-D^aC`@#YsCG=1Z{``I^M6UB$)ZNnP81LfQL(G(T9VYl3E@_sS% z-e1}V+vIN2K6~o!LgnR!pTmS)$It=oz+Hy6N!kNKdl$#}PgF6+54X1zD#xXK1AFei zIxtf%zO5)>aQ1-5chu#UXAp~>5FR| zHK-_#8Q6ZeJ@|E~%IGti`QKElpD))d*c7Rk`*)Y>zgsT<4ygBjqKw|mJ{XL{kQ>a| z+YW!V9Q{X$eeVremBS(bGY{8(@nMX>FF(w&GWf-Z8!wOEA_Q+QZ|d7z#ML`Wb$u0v zWufqt(y8Kom4A=RPp-W=u2vhn>PH&))j@O|%|B4Q8#=gLEj9+~qm6R?$@m;-d_01v z0LRsJkE}1RyLbKn6RnFjqML2nwzY-@*Y<6Fx8P|fTD%0$I+WiXg|Ag$S}Em+v-+E; z{I)(3zd3q5j-H4&$={z+4?E=Hr;GA+ul)UkvV1*D{%(96F51fDszqyiw&<4pw-}0W z-7Cs3FTJAp^0T@V+^LcOP$@i7y&F?~d`IOuFlol(XV=eTso%u!$KpbgEiiBI8 z()lKHA9!7D+s{S~Yz)NF8>Jc-zC_eK@y(CQXZn@0!Zfs=zj5J5#gdEj=@ zj_Wp-H^6?_a28r}V9TANBwve+c9wQ++X>?YpW4n_cJ0%@ckHa}+GBq|UM#$~cH1Aa zQ7T`mQbWG@b;T)Y$Vbr!%jkn&hzq|~zbCHN>ZQR0<@GRX4wnbYyGsA7T1P|wM!o#& z_404kH=bgSU~fp*ukG1icw1w0f3?=vAN_p|0@wbzzHX0Q|DUEFy|=WP{-%2{;A_SGg?JK6 zl*z*GK1_<-XBx!Bw-ruDz~aIG5&ca3q3C2`@M+K6^3ZFs`rP>W==Lu}rO!th`fqphXg#T}@=2Vaa59C^l;!uLnFu8-DLJLT1Z^&H!{DE5w9 z_eZy5d5x{;=xv;s2iC#1#+F^9vbEBOg~7TfL3OIydKX4Cu0n|)jJC%6u$U~|8b=YA z<^$;V168a7O3UwyFeh$NpTfq^MTHZaO1D(j!{WX4qRp+X1L8jTII894rH3HeuS75Y z76><*2W)@z7I?Pr-GF&x3E}XBx$yYQ*q(VYS;|h32~qUGv;%bNp@C z71|oVD%#ap|0JSo8?lht03Z2*QsV`7q5fg480c_1QQTa4R{6)`+KFnX^5pVRat z;t;AB`JkHK8ljFh-d-)&Mjq*V0ZgFT+Dvh_`hxolzYwEYKNXdK2i`c?a|7k|>q?vd z_)y;;9*Vv{jt1i2Jpiru>Vwg?_?-uURXILn;ew zkMM7`TD%{%_ulCDqxZmPu<^rDbwh1?;ZsmpuwzT*+Uz6!Lo_5Cun42~M~(BVfS8>}UCO~wW?I_F>(f7sTirDx#yhEO}yXmV@wFdWU^-rS4!Hv#w^#Qn_ z3Wam1@jt={qxT9@H6rYRp-U9YHF#|HL6+su#W0dKUPQ&NyHc8tuG~4jIjG?1o$Pu2 zTcSs9{lDbBcbpv6weMRyRj%qdJv}*SW+csMg0e)CP{Ia*BqSpY*vJ?#987Wm4#&0v z0s|)JWO7CbkuhL029ty_Ho*jwgux^e%`xEn-PI!@e9pb^-IxA(AE~-~s;jE2c39!J zers(SJp69ByZElRySwxH{W~}p;vaf4!V-#PZYQ(1X%6p5^lgc_JxOKdS4nx@*yxq9 z))V=c&S2+1a5>_$l(_I4;yN!c<70PGC+revaq=$V8M}znck!NE1`MY zCDF?MwjB_dL;DQ+PH~YJ`z_8f7U$G4v!CdIYh3Yzc>j2la2~R$=IMXWO3dwa111mq z7J-np*mgbHPPWvx?ft^}vl@-;#Nc7l_QgzMIjUv&2^z)EWKQJlIK+J)RNz42(3bZ1 z7dr1)>=cbq1m4*2dz;(e>jXr!YUTv7O*WE-@rCB&p*5TDXR z5WhN6?oCHq83JG;)F}LTfS-w8*#O*IIZ_fA;%-o8Oz0oV2D^6)4&Dwt12-rOOH`H- zxc{dT%k+yPdz%K1B`@g~ijYOQc&iB^#Ct42_FDVn+DAC>=yWJld~V z{J;j-a19U%L5l?3>_mN|{;+XO2To(rp6`QnC{cWc!^}w>DW@7BB#u~roZwntJx+ch zRK<5&Myt2c2ax#WPgztc z3AlEh-<91_rQs;_Lxa7ZT7NxcS#~Y&9edrnuUs*CTJ&evDrDD6zjCdjGKX`uqj2I(`8|{IpPoStsZRYv)vkX6J_xO7p1E82n}}`9OndC>NG;I{a5PDewyma$ zI>l`0M!TSV1uBG=GqRg`B)vXAr!b9>W(0PSogwezVcb-J2k8+2KFd();(HJ^&hkZ{ z-^ertW@0O`d7RP5G`nR^$z|d3vdw9HE+h&wNp9gb)2W3` zT4epENoS*M7*W`wTXs*Y8>q_aV4<-p>zk5E&9Y%~VMe!XojIyfmF4>CI9|u+(*{}2 z)%VuRa$iepi)?5s%;}IVTjh%EFO_;YW@H$aWi^s>%{Edu&CM?WKeBUVq_}{Io5dbi zdEESqLJc4QmdUr%e=_MC&&oL~^eA1gbDeI7Dh34=^58@rT)C6_HiBShy`-cX*(dkX zOAsskJwlCh$EsetZ}0W{#;Z;2-`~;Sf?gL)GjqN(bFb;!sQGcYa0ABmIjYab2^S-Z zx2E}aV4KVKZMJW2^!HxFe=p|Ue*Yb|?b-H}-Lgsb1Gu+)oAdW(U_K)ZtgVK}_5JQz z9XpM0y3WgbwC?xokzyq#$Oth5Z+kLcf8Z8nx9AE~`Ai|2u@8e#jf%1HOBo1o#)Ro%Z@EdAt@U=*Hu9qjSFa!GgWFe@HkdsjX99)Q?O|^ zll_ed=#ZUYNu8R%cVK_gp*tJ8bx*E4-(!!pTQs~s$9MMo_3tA%uFKh^tT6<9Vn2{_ z+|V6VkTU4uiE7Af8EqnV5l3qEb8TN=vR>Y9_S21;N17N7h$Z3+B|lg8^&;&~=KDQs zpLx>JQM-a{8O|~@QFU|k&2CfDYNv>55jSaduTJjM`d%D9)uj$pKTv&Ii%n<)Z1KH7 zo`{yai}M($8-D*r&Ahu^tKaM7Nv(gcRb}|hv$X!5PM)x@YD&ysYjyIteN~gqv^;@}g zq|#>a#+r;5!H#<@tQu8eaU(o%gW`oX*Ac1!U!Yiup? zJB)AL(SQkBQYLTXzd0#JWnacSd%J-To3L`a*j2tDgFnerMWLuhuJ=cNhhB4>y|5et zIYADJd3vS^W!0T6H$mC8@jf@;;Dc#-iz#7wdB-tPWgOin(jeg;JG++nyEZzH2=^Dl zJq~5yRv8LH)rqTxe-oqA;4k9fP~4Hmh2lV1+!{o~l+2OG;{|ozD)#K!V;4Ba)vy5b zt4R=8K<=h-H&G_>1~(V$++TzT)*luMBP!7byYiQrUAdQ@AX`kq?~#+NKXR*pIJ%1? zw{tp&xVwt;AQQ6gh^4L|A+x&I*1l-lVClR=6BUv zOKE;tW^a9KC3m|RdT-kjv+Iu=3XS=OQX@WSzAh zL?6iDLz(ELWL}ZxJ-R5t8LJfWO9xc9X$dTpiB)FC`P0mvh41F`rNm50CR(sAE%$&{ zh0T5g3KpEsRG>VMuL9sHwt%~}CQMnT+lLFLVk?5ubC%~NzIj2V&!|m6$4zryw)FXh z$Ri+Dx51qIJd?gNH0?D4JG4%4E5ya5FfKn|k1BEaVuqLXxqb{vlPAh` z9{1{{VHoTlCy`0h#1euT=PQIA;**z#PG^;|d=x!qdP;pWhR5|b)>OVgiA$Atw=ye< zQW4XBKy}MzU)-Ge4tJ<9uz0H-%>^5Dt+~xNW)5IGS_>3c4%h&4wdObzo}Gc)5C_|E z14BoP!G5O`Oa2&|Y?%=K>o0H-P8CZ9$jMM-aTC+&=Zk55PUkbiIYUAR-<2+_8oROf*G(NGb^Cjxw*Ib!z z*fTbhZ6eRrr*A*4=ydMq{DtH3Jzc}mzRo8bLIXS2j_$CINH~3e7}=d?21Dr}Hv!gLnDbIE#n8!4uZq3x>4SQr8YZmM z-UmB3cnujejsOL~${P$gH!N*v_3zk6{5td}`-nr$gPzmb@0{hAL9jNsh>$iMr=1B* z@HstT36AK^V*fU$tLq5ScDR@X$>?x#k8mbb@z_OAIgQ48HY!_C<(wZj;2rkTM1#i& zbm_2Tn2O6X$M7%#nD#B%=dr&F*$`n6+Z*L-M1}f!`1$i1oUW!LMDcKOi1U-GRBd63 z%M%h>#b}=(i`Jg1O@za;xwECl05t4u0wD3#A@;Ev2aC=sNa9=Dp&Al$aw@oZ*5O?y zer6@X1(`fJQY@`<+&VG4IOi$hY)=puh2{q;U&?V;Xiui zOYd@Byi=QMpo%5GOy>lurznY4RER`NY^!ky5F9!p*&{p=brcPS-)nb$U52>sp!?N# z^)$7s?q@*p~0)hQ4dH{X!r=dy?rFSn#qkt<15{3g>Y` z(8P-fq4WFLH4QNsBLIDl=rX+BFvpVt>VpJS`Zg%3UuTo#K;5ZE6R^mjgKY=JP;s!p zMgM~Ua~b>(JpYhH)Mxo->88um|tnXj|Sn70<)dUjSw_2LjQ{0z7)I>UNwx z@c7mUT~XYG3=jA^_f}+rtO8zkR&%s{_%QTQ{lywIVkOc(78w~wM6-i^GF&Ehu_Lj# zw3YMVtlhWKd9Z%y`CL@|QdIoR&h>F=S?DO* zm1$~|;BAHm)zO7qBBskTm36AX&QC&rgPou2W^b2cn6^5-Q+6yZ-qJ64li8N|p?9CE z^wdrA8Qy-;YdlW09xIyJJ&~<>N3~e;exu-pd&~~0f{C6hop%Bek8v?94?$?C+Y#G=yZt-&b4i5({I(3&$!@=e9;v|CXdW{C0P%P_jWY22 z<%k$VEoqg-=28>*OQ}#_ND5#ig?~ple(Kk0VA~r4b(pBL!EF>~YUCv%UL_!h6t5GB z2~%}*P%pg~0)ML6#5BMf__dA7`K>{V-yZ60?@J=QSo*U~lX1gWwEByd58FMe!>tdh z__QL4Ve~T3Fp_0)6QXW>3&?bdtiM#sOJwm%S;eYcEj@R1K8OJ|H!n{wbkGfH=pHDG zH`>&y8kY7-#xmGR{zz<&lPb@b>UTDYXQA9nOm_R!-s&_V8~ok84tvTJ^zxP%Uz6Q} zsr63S6Kv?6xHa0)H#G2hk2Gmn&?rm=4dd z?9KH_LhV3wO15Ccxt5!yxT^i}SF;~qCYN?Ny{BmBv7{;)>{vJ;kUB9YE$K35Sl9?o zSErgoNRy$AyWN3YfORbA$x2eF53_fm&h>-*lT6ZoOV?w!*&`+T`$u()Z*Xz^HI z&DZmk_giSp-f!icp4q30>Oehq;|Xb1rhY(>EFcJo-qUWJMqb?DHfV2lc~Ru%g^4Rj za1;9z%tgZgOqmy@->0AQ^vj-j30_|KvX{7t8=ek9hx9Y$osysgm;2^p53}db(maK~ zrNY8yTKiXo;i?dB>90foE_?@K825(WgP|qj*?*xFZ(v>Iw7<>|U45*w7+mmXqov;yGP@Lzh+oZl-stf(foho==tH1GsmTiHRAk(|FISgl7 zUTeumjGJ_c|D<9UOo<~!?cG>%MsB6Ohw=QVyH1*`?Jex2NUrk-A>Xb+V0{aMuRZw2d5?MAQ#a(g(v2Un$chI2%zjBMCoZjG_pv2(q-wJi#< znXQaL-+PsCE-u04WNHxQ!@Q`ETKsa98TK}9^|;Ki+E!1uR(-l;nI&S^@5&6XGO^D@ z*_W#K7KZ26tw0JnEE&TCFWQ$F(5$^HoYsS94BmqD=U?)97jqqx#y1_5x-W-=&-la4EJQ_`)DxqJieY02V<*Q2J13$(9+RPFMil5b!CRv zH{4vn-F=J5nRQC$Pn;JxyEs3T7u52-^7wT|yNcV_wg37u$LNP^^tlXS0+?8iA{wX!jrYZ$5 zYJ$z6tGVcb8R8KuaL^_M=QlADwd%T=%g+-uW@xGqA;?XyMlu>4mMtac+@|l7;gCYDVhf zw&tHQTBh6``0+$e}5rKULx3UMV z+Zq;wk#RrdeLH8TMs#+vE!#vun*>-=q}5~sb71IOL}LfK7fo7NhVEFFg|+f4laNFp z!c!ZZ?{C_f(L}-sd%Br#_(M#P4<*xVV6R0p7A}`WHi(!bAzWDvp#im;Bz`Y4k4C0N zeZsX9f>{B!Dpb^00SzRwSUnfHe~r{XMfg^dzQio|LtwksA#U90R?J6WIzK;c!=OAa zGhKGjOVpO`CUSc_4tM5QU(Y}<+a>_66Hi*>>42vd-p{oCM>+%BV2n@oHyJ!u$VE~1 zcASWh6~M=0YJTC>g3k2l%+V0uj};@G8z4%mJ7xHw3>XN&nZe_>C9W`aGPuw9cbmb> zjckm5Z3Ztk@|Pw)*O=3dILm&GUu(%{p083%`Q&xb{92lKB(2e5h9VxFeCo0{k~#=c z)SLtB^qw~no&6+unt0LZBUSx#GMQ>FGmWbKBmMhl##Y+KDQ3+1h%W~hx+|TIRn2G zv_K=OMAcc^v8@x|8fi`b$@1SsXKVXweSu_+3C_@TK`k}%ap$g_JJH#8fmq^r%dYK z=J{_K?+KzDN;i}+U#`~XK2B}C-%H*%-XF6siZkmwHVlUovsT$#Z>|=&r^9=oyhCJ_ z(816Ew5XD5ZT!HCN#nMtYm~ToFE^qH*IVF$SD+o&_d}0shArqdL6BfPKbnd9K5OpZ zB<#>WVtvC*p;5M?QG%XDS))vIR`^wr_Z$SEAW**m3ev}cDeAv^`Yq3_41(pgCi!T% zNtQwUS7do$Q>xQ!VsKmTrQx{5l|d)##)GgnS9$)1X*~aX z;^JB=#pHJ}`v;B`Dj~~=2hTGyR@;fPU{Pt|_^cIn>CW{`MD+D8iWmCbz)TFB2(>@5 z+wV!T&qY0t&#inu(D_f=s!&ZE>e}nAevt8>gXG1a9<>EQXLkxi>|r@V`d0`5y~b6~ zdgdw8N8k@%;hNR1IXUo83GycgdYzRXQmt|eso7Dz>6%a6(&MiCnyU`?;!EJ%4TQ=F38Jg|AN%NgvaY9FA7*G}A_;VTxYt&JG&m&E@xG zpT(X@k4?mPU7y&XLKo+tH{)eR`B)Q`YCt)ZK%G=E7Wo{^X|i$}OI1=3BEnLmuyH$^ zvFuyMw=-fo1~A!rx^g2X(#yT0xarY8fyd$)uP+)X^p70!2a_RhFdA1JJ8yzNzIB2( z{y;|7&`lZ>Fc?I6J|!7U0yXR|+HxUTcMrzZxKWnVDm1rtiRaoxj_F#WTJ5;H=5gOV zjE&g)kUvtke;(>1BJn9XEWJLNr=P20qx`o;Gap-A1Q~fSrLLL(m0d##o4+kF! zxow!+piZC5WXIJ)AEgkG=+X0poJeSBve+u4SWSg|u_Y)3v&dU+HOk}SZMjy6$Hnt* z_Eua=lziYDi-Lv!!2^|;9Co`{FdtNR(9^OgUD(=fdOi`nY{8Bdl9>SFekESK4pY)@ zP2R@3xDSNCyeMRd2Fq0NS*X5Yc2GY7-iT!W4&_~|a-k+uD4-gOR9B_(t*LrcDH+_O z#PUK--aZ6NPd|`E4^i5OQ?F+P25Xb(j|qdTOI;DgM}Sj%=P>WhKISLh!!)gC^5Jz( zNHZR8d_}CUjQueGwvq)^wMW<~xwS$+E@A`{R^N-F zm}~&?U!iFn=Ps>(DOI400jg&!@iv0&b(B8kQ`b9x+AC1vO)H{*!`Rj!LBp zVy7C{AIRjXHpfj0%&et7Z3{btj;PCwxK@l}E_RnXO-E<18NEesF!}&KA1jzf3=wqn zY1VuxlFT*m2jv`@uZH1#_pgcnR#KW5Fx=7TbYTu@Lx2N-*m?(A{3YA*$V(LI!fDo)(s58jfgjUSQhD7OXac5PNyCztd^#8gn?BxRkYJ?8Z~ z19*ow70Rw288ZrHIk__pZ%wgd>O{qi4X0S$9u^>|*FtW~GFyBrut;OZ;}yCwq9=jM zghj=Flw~jzZ1vCbI{Bg$f0h^cFG@7diB{Vhwh*N=f_I-S;qwk`C1zAF?~@m~3wxMQ zJ9QU&`q3~!ci6LFky#k=`Fk8+;25isMzgP-y3i{ zX2Bn6rs?VVchlgZJU#Izp`L@9pT8i_WX8x*@1-~r(tJ=zKQ2g{ju*iR&?lDsQ%Vu+ zSO#)nekqcV3hu`RB5A+M>)T1sL(%K-)Hpbo`$H7$6Mi2Y=X4Rk!fi0^MOnNcE?gMf zKz8FM{_C;7Iwpm^MP40;t7CnA&dL<^Afaxl(;m}pb~ju3j8(NK(9K_q=H;TPgM0F~ z*#9%xE%h27Dxf5jvbPufp{SoGyElHO=s#QZ-;UKIG3SGA0Y3>dL-i0s;~Fm%nZxkk z} z!l0$Moo4Kq+y(ieJ2y&?EHOu0#{_-j(Q^H0Ir4)B^|)y445o9$-`|^{#}_8~6a67I z7>@D#>e=6p#@lX+KiU3W#%2g6FX2UYTFkD+IEPIWPHMA zJLf5^gTvS#PI4@>i$6vr!f z67=LqP1KWIgq4p+77i8*8JpGONFOlNZCq$`GV%%Gu^-;>mnN*2nepVXlN4A=tqE%q zms~8jRH^8?_Nre$!#?=S_QA)pZTY`?@Ob#aOWA|d0<{OXjnl=0Z^fF&|N7uZ+XsIa ze^l?Q_cJT<-am8MgCCqdxc50RU-g*st8W+8lzkrX+5R?4UXoVZ{w`7vM&g0Utct=*qV+0QR_>A~$vdUE zOTNO~?B|-}mR9WL8kUJ(JK@)FO9KYN@E-(L#w50%^Hv;;Txt*jbUhgOn2~h$xW3$& zoc+4bo^-7kK5Lm+>f3|DF*`W#m`snZCVwhLuFLBqV4es~8a@rRqe%zP8~uVYy#Co3 zu#K0EIW7v0!j(wgHu@c7czw_K?;8ESL66=N>6@ecClXHxO?s73tE?vdR1Is=zuSM7e?+zuAfz;Z@B(j?gmA=um8EpeF3s$?$+8O2f!g3f`&zt=9pE)9714tnGC^f z--@K~U9wO{w<)@XJbDl&_jeRm4z70bLCrO;z77fmPMK>;ErcV>hyYg>zNwncPUf?~ ze>XIZT;n4*{KBwjY|>EN5&~6CO&v$HmbipfQ{R_ok~bzrz2e((48s&~Lcw}Sz20H9 zWGJ+PH;}0%OuLfLtgfjgvq3Gzs3osuWTuwJ(aKS#mikaj*NQQ^&kX2(y4xQeck#g8 z7S8xm4NM=DsDV*r5Ue09lCBWdem!883vY#p`%wfd1b+ZT7M6=l6=Z*-3kE72H>%$s znEn5rE@;ejL4-6MR%xmDVuLQY-AY6D|8MAmQAoqt|BWvApFVxO{^?7#r>7lg4g2)A zmAZKPum69h5H>Wyimxh!|Go+SR|?_l8!3b_bo?QQlUOSjEEhbk$~rrjy@vf166ucy zqU^8ya^Ys*H?9!uk+l1AQNKcz`cVuk#7J6bg=pdMIYh=*h?GxN8tCBvKd6R`O=nG& zSMjL+RWZ|I_`)1m3v+=ra0`z8vnqQUB6^3H{eg|NY2$5A5YD zs{P|!@=@-;sP++P_D1zyV%|=qRqQ2G4RPwpl>S^spz}4geq>_KP6{8!?i(>f4O}k8 zAqds7L>-mrqZ4qs6O&=Reyp;3eNs5me5uz7%Va2UO|ze=qKiR0(Ck9lWBygMADn6S zA0^MLXq{y$>uOE6|4sSt!!+DTw`bm|?ZD5z)a_ST-F^_doiG2_9atEK$kGfV(?Dc3 zy>0=r^?E%)ulJ(Ye?;dk6Srny@>r|YUr_`P*N8(mntl}~UefOk#QiAV4I*a{k+Tio z)YB`Imx~Zci7zYJ!Us7Eb(m(e7RDJZLA_Vlz@iSo(8zW zz}dzxh;iBiL$J}sq}GLP*k51vOOq>PZen*;pqRHcZ`L$|I(P$(6fRV%;hXeDHIraO z_)&+9QZyq{KU{(B^_;c6uB+Kz_eaTVneFvxr0$Evy^*;*3NQHYY_BKGowAqfj>`ll zSFElOy;jYx-^l1$A#%fi`MmSnNK-^EY8c6ySzuNnhXW(&{c-*I0Yo%M^krvWM`^O` zV)e^~zd}5QBIm8h(c3xi*G#c1qhU3f@RbyT;dYv&xN5SFN z6#JVszbNdXKQulCJ3h9i*bR}sKFa??dUiC_s?}hM9i@j&vCnFz*gs9U!j=0Cn_{23 z{%2pBV*l*q3Xz%S^=GuZWw&9bnib8YoWUrWM%13k47EKl)V_NB;a>O` z*KBSLHE`gXq4sz9sKbWZK9U5{-zW?a3@diWfy7h)yJ$Bk-)>tcM z#@cp>i@U@jcM80}`$hJ4O6~2q+S{htzP{}BQg+F^1jPk7x_l=*^6SKohheXHL!hMu zX@)jGOr$GCbx_+K-bxV<>Vq0+5_#HnD4It$@Q9}^aYa;wO6ISOC z{4SK#*+QQK)>?HFXl}-`uqmc}jxetZ^Nb+UXf7AU%S3d!2=`S}^(GWxB=SA^dh&5^<%@HP$ofWvmgYazUew-R}qgAwbXni>0EE+!J0 zFBza>w`u_mvcZ}WVl9<+-L{||aGg?x5>&X@8FeIGdc>?ASTQ5pdZW<|c=3}5^8Lw> z9^7ll3>L89PLS=zOM|V+ih=qB_Jq<(mAYc zpqm&;cT0VbG^+z!@n6PNu`3xdI~!A-jHy<})Ktb) zi7~a$Mq_HvY)t*t&4$UOJHV|Q(g2(eb_ zui!|ldt$XVHjl?xrBB6Kw0J6d4$H(pz{ZM`&jkf6z4=(43&PM_tD+}J3Bwj`Bs$h& zDBE|2EvPmzosYygN|^n~9vd|M{Lw6%D23C+q3tGZ@6Ce4Tv$|kmw8$`6)KF}D6C-wmN*QFLe}{uMrziWV-(-!|m78IHf^qsj?K>rgVUfo`c#-Ngn31qS9S7=rem}D{f0Du(fW0* z-qf-?yjKhxC~t}IPnp7aN6Q}!Tem+{Z)^V@D(BY`eJWBHq%gsZG`pC6AsoN0&EF|3 z1kmFbDF7J3_rcy>ZlaYG-GOaw?cI~*u)TYl#NPd-G?&ZF-u>jO_U^ik?cJ-4x@o<= zd*gb0_omF=g)5sR->Uy|(*G&TE!;!Sqjuwbd5HX6s0EhD_NBpFk6}w&1PQbxu&RIx zA3+Ss3(XOQ6#sAwg9xDSP{(0&bV`3UGk@zV^mAM5W-TK)dZ0Nof1CEETbY8`1W9Hp zFo#7pHN%ydzb9Z&=`X?zdOR^o&Qun9JTp=!MB@0!d>Dpr!`-Sy`z-W$Mh$vgm6^ZS ziE)RC`fSQqSBhQ)y~(!BHVIaW-0&V`*$}_Yo~gCLgG~^lDn>DK#_?S)6APoWBd!y} zmtgcEF|LB;$XjtR9NNyg)Xgx+k8QIcRMkI1b&bjl-xDB%fkB??>eF1q>lv;&-Sy6L z%^$1V=>6nJ^w6k0|xnB|3=rl$r`?&YW-Pe_~L}sFvu-H4TDQ+hHnoT- zyFJqh3Gy$7?`y8cRDIp`;JBoIx0!Dq3;dgFhVSqh?Jh*snyEVvQ}?S!T;zpEcqF%O zZ0bIpnYw3LO!5FK_2^6g4@_O}Uoc6}Vv=yGrVagorf{+b5Y$NiXiesr}vN`psjIAA`r@v*> z%IY`=RB973N!C&JyCmBL&M384N>W}UH(3J;-Rp)o^CcJfI~Ukmw-DRFbzski6G`M+ zW0`L;TeQEu5Aw3tVKOM9fG#OuA#ppBoJU2KFjpi)Jiw8*rGOe`t|jRwTPVf!cAQyq zCON>iiqiBQrrFEv?5raqUys%gZO_=_wso8dq`puFP|u%AebgJo79_S(d6ujg4rn11 z#&>yVh><0Xvl^bH^3|(N;*}+svNQCYbRN(0+Tf8; zE(B>-)|P}+AW10H_-_>Gq3ATlL|RpgYe8;AXF>v<2^-+%rv(DKRElGe(hYpm!8Ta5 zC2VSOkUKLhc31g^$S9vDh?mGSnB)xo8&uD6w9Kc{S#8D;GVUhHMRa)`0rqwJv z`lJX0SyQmN6uk;ZBAHkPWv{n=v>ImX1%d?LxvV$gWIxIBMN#cX3C6mxYQII!dlc=& zT@KC7LW?%8Du!~-&=JB}=2eL%QI(`<`D~;_cqPx4esrp0KganA<%s(u_eyX z9m2WJgQw5f$MPpt?VPGuTde^DW5EEh@X}6Sef$1Bn zDK)M|Rs5TcG;B$2yD9w4*OC+F$lGwuFE!xs;W5Z=9`dH!UZ}rFmJJ*BIuQ_T~**p8i^2a+{3Vb4eg#4Ju>Ev81ek8;(vd zu$L!vEA>&HcZ{cw;^I&TrMHq0eaYqGiGR3fkg|{3lxA(7kme8n<-$j!vMJt1DhcU$ z*X!_QRkTCyY|OfIY_XoXEb;MEmdF_Gjy3yZO!3ZI2avjL-YtbAa9^nN!vKsKh%MC1 za{ci^Gqzr5T1s}vmvY~S38V{Y#jEow9d*67qBnjcuq+!z7e$>gb<=?Fbd%fewW;== zwqEN8bmlrt=kWJ!ozQWL3?Azxo+rfl;?vq&n=`aMl@_+^_Id{BdOg%VI6${=!#2x# zlge9dWMd^C5T+OFRN)m>SYHDD1)b)?>y7st@)4c*J1kAJ|?3T-en ziYc(n4t)iMqJd{^;7OBj7*%*VE9gdKYnTZ&H%%o&UbAA-9%GtlSq znSo6PR}M0zWoDQQeD7jkUBGfPKBaiPbC@HHw>oo_Z!YvhtEO`EaG{$8Gghr9`V=GIU=%)Hv~3a&kyRu_UK*LyhjQh&%q=JsZI~* zetM|R;?eB-KD5H=fp=Emo*oR}_elYjCQ=-uVo*nh%;|wSEwGh8F<@g7*ao+ig_5!2 zqT*$}cm)Z~06zT`b}GXB9Ls}riGyw7IYV}{Vw70b+)mjm1EoImNgt^J7@OTGrZ_`u zrSodk38lP9t})D~#-zz;W)RiKKo=Qq5f$CT0?@G*4}|KzFwAjZUM57zS0K~JN>Qq@ zZpra|ev|#?70Ty`y|cPXtK6)v(opugOZJ+}UXPI3+k?sRdYm(~Ipb~tCOJSmx#Ss)p$s%Accdr!1YSM9)g~H)&@1kNWB{((*u^F3Lye z$LdPs9pD{r3o9L_-49J<{eBYo_BVTYzfbj(Y0K==p5_x_I-`ox0d7(b1|=#DzIDde zCM0dAWA0R6V+LM8g^;C!2VBAoIKCuk_sC=K%9DM`($Aa?&pe>cBOl_OD3!F|J;d)bhyG7ydt! z^y1W??=OhoE&1=4^xsPA!;(R{+$<<+=Qg)iTMU%1sw5%o#B%wbvftJ@BJ2#&o8l!h ztx!$BG{)Y1;ltE#iY_Vp_rSY0e*RJ8bM)P1bx*l+x;9Vw>RH=@hv(HvIdya7KbVBS zP5d>n{IObT%WT}Hd`1na5b>ev-|Oy;{UZ}KEonFHnAzBOcHJ-x4jH_g58s0&6?T&U zfn7mr|D8(RL3c5sE-UCO3sj1@Ua7~FMTVY1T*DBcLf!pBy`ubA70CHPwj<;Fi~2W3 z^P=`YR_Y@g+_FV$i{wc0otr>SNIog3+l%H8+CN33&M53h1~$KvTvF7R+iDBb)CBb_ z?H{3eZ}$4EZ5WIqm-8wzGPQ2E*Gq0Is>h4!4eh_F)pT`*;obOMGM87B@U$H#wEkOB zzh7iILYZD+7+Hqb%UKH&C8NbhMfE=Q0h9npyHOVEcOcgu=+12Ik21@_RMgqhKTVq1 zGz6U_ZqBKvm495Ar_^Z`QrN?h{|?TSS1y)RS>7Z4vbs};u%8b|u0eEz`h6bxw?_VS zH#H+vSD*B*(Q1vZ&WnB(`Ny%skvTI?-|}#rYsJlOrecBPe4z9#0t0_8h+wOFPr4J$ zWPeNf3lWs!_NXrI^0rgwxVnQR@mrMjy2lgZ$fh#cOeyjJi;nyRlI_%-lxq zg!fQpk^>dA`56>QBz+%v`cdJ|G1EbGk>+Hi+e$~xtv*~O)pD|EFSpI_BxO~UI!a8z zM&UzFRozWo6hic9lmiP%_+~4%Ib*`UX^=V=fwAm6PK{j%!SIKZ)Wp4}=*iE_Vyv+c(QrNow%fvSFd&C2@)0l_8C&{3XqQoYr3`IN{>YF7pE^F`f2&!R5q zG!$y!MW&4u!=JIR(=Y0iL?p5ST!z^YPcueHl9%ig9StZ>c zo4pYEZZYjFB@oRim}s|L?I_6Rw$O*jo21W_ie^d8!DtdMG9w-50Zar+_FXT~Ug$C{?3Cj92tN?4Pco=xgcB!v96ku#3 zKv<=o3zqkzF;;iQ8Tw1?ykBjvqC-+Lo}tiy%zsd?Kdz^sFnnnqLz+qP3RQec>WUjP zJwL4mH`J?TTHQ=EKpfRD{MTimKQ_+|38`OiO#jkoWM?+l)t?&mO-*J&+{`zpHl?RE z8QD|&=BOt7&4?Jze-r1zQ@>292bKDRQX_)@RO(Zk!DgqI)W5ISPu9cTg{qF%$>Xu_ zwR*j-UOt9R1TPlpgR>ybU!}gkY96V22np(uzEV}|s_|;lo9*>6AgPeTsb@F27dAnn zn;P~}l{)(dL&1LYcBA`YBRuhZGJH=qBeHhD$qnu?4Oo&g{F_kk!?u%$ssn?xev+ci zL+nV?g^(Vj06J~TA0uQbkxI)wLi%B)^L+10HO@YvtNx_a_&A;W7I%o7S=YB(pM2_Y}q0}=3c4pV;p$Du!;7C+Xd%Q7|)pRU|!j?4{K1L zRl{xd)m62oN_%B3;ZdLcQyD*8)sI!Z8>{NUD#LM0b!=7rrb*pQ{TF?cQa56&F=%Ve zduCOiMOp^#*q2RyRaLLTN8_lIlsb{4`MH~`>XxcJPPq>#64K|I6BNCqw8epb*TiFa zOs@pUmpLW%olWZ2CW4Epcoxjy%n;|(ai-yHEyUxE-N3Z_sW%7(tc6Ml*0r_}L>p5}){(c+lRXK;s9LnDp9o!OuBHx+NdWcO}jyq~^1$c{8_x>&k z&?|`aFo12r@c5vOY6LH`IjB8)Kx8$E?YbQ?_sOfRO&?C5J+0(S*v)y8v&S`(=TLKy zQ?ZRLlsiE-TO&UlI%tr`8LIuJr8|n+$FlQBe%@9T29>f&*h19Tp_#q1=(hKacel?ql--7K`?7k>G4=GUy!t073G!;!<0+dw0qi7@s|4%L{Yp5OQrNpu zS3UG|nCPP0Lj_qnULg2&=MB3K*D4#F`LH6+r`@+$lXn%jY4iUwo^k`4|J>^qCoVwohvEXToA!=hD1cttAv-5_kEL$ug5uO z!Q^tlt=mPm?G1CQXQbm#PWdZrdqy_H8NWpZH>#NB$u33gNu0&vD|W@4+Im@+h-O(n zMuaDdu)EMwRAbja%#+!}d`GSjJPWK{z91?uhJeTpq$2JlzuCia1q09SmIC@?qalhk zljsfk=8TL@n=UOo6X*#~UN4<5SSbRF+&T%MU|Ag~oDJIiO6^^t2l!N%?{M2>rJMTM zd0oX(|z%$D8p4zeAm(1=Hm80KjtBY5e{R z!g)bg$q%8_b{)}Veu!lM9CbIPc4y0C!-k9AolTkv)Lkpe#TnlAXA1hiXsffVsg-5v zdy(Cfn(z`PH@Xd{$VN)+HujKooHk5qJX$h;-o`{{1|jkaAnequ4ay9;)#MHiW{zZnNXM8YfdxMy=ggnO>nX3C{a93gaKOax{a>?Xzlugrr9I{ zq@Euh%zpR@YH6B?=soZesxpXg6LEb!ghjc2Xg$xf0-7Pf#>q8;mG|=EKjcg?T|O@a zr5(jjG0ln;_npqPg}x$Zz{G8#flliJPjx!8i; zB}xxY!qi#D+)J@d_@BBE%4yO|B=bR5^7qOTr8=*XrCX#&X@s~EE+|f~aoVqOA(x}mvm%)INJxeb;km{My>Ep}ug z7p#62AXsXg*^(j;7;H@5UuVp@O_qkvCMQT|>#9Ei5k|x;GxjWJ+JxBkZh^JB!ukSh zzZdFD0kZfUp*Ir)c6G#Xs8%t~b2e$OQ>}I0RA-shDmk@+1}uF--8arP#V<>L>}-|G z?#yH~b~`zdb#_6~^nk-{q#(z(Lhe6@i_ynBQFNw7+LdAsQ*JvR{S98>TFMhe z~k>)((Q39TsERZ;(Mr1DkXBSjclpR;}Kis;8A1|0u1p~ zzy~s%+WD3U0c?#NHZ4i$QjE73zg2{kyQ{-+7#v;6Oz^fux z;KI#v2CE_Pf#Mv@mOzc=x+#l~Qm1YfD~fHggL4xVRXWMK+{h%EZb!}Lm^D}+4UfBb z`D@*HLnF`c8=|sreXY5w_ARNL?>fJc{i*z#f~;<4i=*s%5tnmU$SVzECB+e{ z^HGUMye)8LS%~;DX)p7R;PAb$M1Q3?;c2RyaOnNgUh_IRTDnJz7*QFiQKpH)in@)2 zaaExI=(9{KKb^@94DYA#$9ben46(qqaLV5*YM=kKHTql#o0 z?Q0HFhP109VZKwX7hiAY=OR-V>N?iVV6l>A=+@$7Gi3mAQzVe&;~@eo;LRYnSsu7B zu`oFri~U>k$8YqrPSg;5KN9jaAxTv}Q3M^7+8gfAS#GBx^B0X!PZjK#Vr(R@7icj` z@u{1{c}kqGPSM$0E_;2Vw(m8S{k8jfYLc_X^>SiyQh8#-q}?Z)N%Ps%#BNZUzDbA7 zN@wmeE15ZeqBrSNO(<@TOvr)^+`JD)$%0&%k%ckwiwYR5TQKwmyWx(86Yz#rjFX3ae@n)?-8sRnjJ9?aZ zy+o3fb%WX+v}8V;atUzqD@yd4L(pKmP^5T1cq{FL_b>&aQQVbRPF()KH zF0Zu%5Rf*i0#mM;HB_^BX6S|WMYUl?sE;$D1RtuIeaNzJa$AS6_3v8mOus}Tjj>QM z5$xRN-l+mvgt-UAf`qF@aAP8Qb`>R;Ba*RAxW~i_7U&@{UiY(JdcBn&Gm#%NzTsRa z%hbuNa|?dhw&78y*+*?<$qf5Q(;pDi^3Dv@^9$JX70S&|WAb8Gu?`cGxh6>Oh00%?6n#ZdeNR7%O6_@(D{O4d?UyA}_>PWe^zp5|m3=Ie5S zGh>ug@Nw=x5cF5#8Ty**3VUfE}=)2)y_-OVPQ}ud@{#wcA-y zTGr}Wm+G0;`FSy@yb7Jr4nbt}U1sPuGfEd@^6>FFC?$c2G+p9GF9j~D+~kQPJ(S z2l=Ce=y@j5{<8QVJ?n?w2WS$<`AAaOJ(Xum76EAmRi|~w$V0_0@>_BrxGXNaSZsom zz&^12a-y5kZQ61j0f@T2ygL(|yv#O>4fL1!L%1$`4;Vw!c;*t@meJg_0=ihFH0+c@ zshlsJEh?3|mg-RbL5*`7M02^Rt5vs%)?CY!_I#V@?CbD5Wwu3K$q3Pt?`8lnseTTP zc6xqV=*-xuqtaTE&Pn|V?WZa1lJ~sOuD+U+X2{fSFK_)Oh)1f!4 zz)J^tkeNJ)*KwTSDN>%|KB|8tJO}ChJi{rmcNobM_8G>8qh5%@=cDwG5m#-I6gSNw zR{1=WJN8&YlG{zQtDi6auCpLs<9V!FHluA)G_jpIM2(u((agWGlL`~vZ0ap!>QQex zKe3;!?5v21h&~WT&xZ1Htm$GXPLA?_4%#k@!WGsie$g+b;`OljPFN?4lY&^>92Ra3 z0Y0CKE6>`x&2m#at{;*^_sf=MN~K_aZ(5C*f#TXIe`^#%;zO)}cDxkiUk$>hta)t0 z&GCd?9f!rtai}IT=veE5vaMs}+gLV?I*w~&U%Sq$Ha`?~giMRUShB@khSkFSP;M2b zMWLT@Wx0TMHY%CjX^&!QWJ+ewnB=VD zYxJszs%gSU6pXU2&KDMtG-Nab_HeFfINV(R;B7eq7&wx*S&>d&tG2=^`ltb zo&C;n>1b_UgD=zc=P-DYO3{^dA$*v(lj0Yy{?HYFOM)**7Aky5ZZ*|8vEK1R(wQTp zEsDJ*QfL_+^Q&7;(flI5YQ+_wq)q=xxV{0!4pZQhgfahd626w$G2c=t+>@xgleUKv z^;_x<58ahmFQ5U7Cv{U|*nw-g9xTkr(nQVVBoWK<#hE!Q-&=C5?;*t{slE3ba^_F5 z`xj6kadVuP`CH>6F_gU95*JhPQv4+z@t$~sgBp<7Mvpwkmlss>e@w+6()@F&pcs`E zvu_6Zn>-{s;$dWl4)c_L-Fbd`q2F+x-!7JTso#!0G1K3PLWlt_42zMeX3S?3Hp%_c z#mPv3qE^e)JC^*!yEp^Bx*S{>D(JR{Z>xAk+U&%(Pba#k-Yh{ z7v_?8E8)3G{ZA|FZRg{t37bJqmkPu-GP>*@Brnz6$h*Ru>z^XM$e#^w2EcG@@ms;V zXg5h--hvS2=gfG)g$B?ERFHrbMLZC`S0L-n>5@RnAz@Q6Ev`giycN-*Hnxe;;mlk- z<`VR)m^=lyF08iK?+9k`xd4uq(n|7thv*s@k#9YuC2ehJdCBk5-J++_I%cCyYkeV% z?D`K(1E$Gv!IX9P< zH!{T*+VfffIgrp(ksRIp$k3v}W@kq0Ku`Z9=jkG9s+~-EhNt!)iefi6enWNf-R;TS z)YbxRl|9hVY~{0CXhg*IMF2c|S_{Wz(|hPCy_w}w`zx3-fTvS4YsO@T*;bjHy;LB2 zr}E2GqMq_9wrCNoB%I7(o`SJ2PEGY`O0SH>VUf%0@<=}nQ7egiTd#@q$C3Cba(Vs0 z?hfur^UR*YC#hMM6Tc``jw{72@psKp_c>@5nmNlga9Ui1VN-pAoLn)F!T;00wU5uL@A>5A|=B2n|)4B z_`dHt*FOF1&dko-bC>`9zkgdOzg55+i3%IB_TVpK4e~lD$Wk%%ycY^JK|ZR%^Vh~{ z-_MK1XBp?qOfU+cg#3|R_$l5!P?ZH(IVZ`==|=X}w#pj`_gmIt`(Sy5d_=lOI4v+0 zo3Agz_#hBxGO;n-htgfMExqXDCe^6#riypC%&_gVT%sN7E3gJygfk<$u_wgY%N(; zR2`;20FjuUN*ItX*2fq^l9X!&j!j7v*xo-;Db4#MkiJ)~nU~0*gS5S&t;T(ztyQIN zQWCrn?lk;kt}`KE_1j6YrP1xz+xJBvZGeiqpJh8XWy8TFFp(7Eq1e}mLn9m?vbTEF z&h86=0VdEGJI7HZKHlW_Zj&o)#G@DILy9icth@X1(3*n3xXdP#@TJG1$!ER$1>xTD z`gJMzA%4IP5*Kmp(>k`bYmNT2HAf!5^UQ(TC?7gJ*bpElwU<%tN!6bEYEOq+PnW9% zyV>u5Q)aX`;O51ImoxF!h^tDeq%DibOW{)`im%>ie)41)F8MpsuO2Le+Ihiz_<5Od z9X65pSNg>V<)F_IC<$a$nN2pBkvA1dYjf_usd_dZW+bGN;d>j+v6t}=4y5yG507;X@OttP>=jv)t)H8Ur zLf%*+POs3^8!8|Wep@zOySP%|W>M4|or~~SL?|6gF4>~O{5jPlTI2+1SA}EdkqPXY z`T{(?alRFZ1P^s`;|8`O9S$)6f;wU^_0}ivi%vB^*ECNL8p&X?ymgJz3X42cvM`RDK)h zAPF@nq<=II*y3`q#hQ76ZG8$t&~H$!CZ6jON7TJ00vm7`Pn1VFI#!K_R!uqE7@z~n z5gTJVtBo3t318{W_J!D8_<9NSZvGZkhpn1#6Y@{^7T-=moC3m&T))w3t*{>g+nQD> zW&J_J2!x1;3&*$RF9o2fWIqzM| zRt!{hJuZhNBVM<|KeNjGbpQ?c^g^xj2ZSp8gj%!e8Br2o>;ReiuWESd$#Dy?#5u8CuiVF z7(Puxi|;`!=ufNK@$qzU`piYf8k^f%9k7{Uq3VLjLE$!7z}Uh(2*< zoV3cLw$x;%7i3GAt{L7<*z(S8+`NjPPqllPlOKTu-ri2^VIMBXnXk7&`@j>WP8Oi* zX_v&c|IgI5Uox)kJpTPzgEaXgoXDz*U!VFIQr{jpw*?{A1gR~6Oo-4GGbr_xPXnhw zEw9loEZs#rs6#h*@--XG7#XLeqjjjgJ(_!y)|eORG9BcJ3*gD>L?~>tc$zh90UU!1 ztq)Yu;I)A>;1dEw8Dxm6{Zpw=si_sTOf|hTrripndZclptMkzUCh0=@u||A9-Oo+} zmJ(XCs^1oex@3Ft%o3gL^v#9dDo)=t7W-TJ#PCb&O1t`!60a)vze+E~DS*g&+qiF| z`HY`l z#A}tiQG~mL0B$pZtW+)xSN>8}BdNeM%!T>0#?4(UD$$q|Wj-gcDa&i*e?Sh2HSz*` zH8oCVU7$?6bz`O>Xzc&CKD10J`3nU>p7VjC+ucRS>0?TQbV79q9WYa{zB3mbiVO87 zq#odQ!5=5Tojnk3t3YTZ$>qDfQiJa9$mw=}nHCLtolZK%jXD5Ewk!XeH!(9PKs{B| zZz#Qr%?DfHVIwkNh|ET0cDH4C1yiVQb8M=)bn0w6`9m~wT3k7Nn-IBz|r>{5RaX)?hk4m3LtrsP0 z)(UZuKG5e_El7&KR`f@GgM-zvMUH0cWQUE#seIqv8$YBDekaIEHa4?cPrW1Q-KX{a z+UM~Rol|bNJrHa|jfY0u{ZwS428-<%sYkOvc7iKz_v>!-GYjoqrxQ{wviPJq6Sxg# zxRU`vBrcJJ3xeZJuvB*GDqyYu;YUyT)yMtdTYUefSN*#e{Ao)B?jtmjwEh7FEhV^r z4`2qhLsSn3Bf=!7h#aq}X;G)I6~r|MgQ{PQsuT}Ex9&tWpS87hyxWMuV+>WZ1a?W6 zz`gvBT!UZEK(l6jZ=EP#D7w}OeIZf2mY}&#j>2hvp~$Zj_Jy?D`ha8!k{zhN6qJbL zb&I#%@(0*lg%4f56q?{DEz41aAAJC7Ws3K`>!w<5C10kz9;*|+dOfn=RW88w=W?%^KW|^J5T)HHOuh{ z55ZwJwi!k}7!D&bPxD}{YPgUk8;xQzj-zogyV_>4(cWJ{4-V2IJJk3GMYWQw1|vG&Aww#b+18IcNf6TD3!J&OVK?E1W3o zFgXpWJ{A|-3)xhNm=fV>deZv>xBRT}rs>(nz1j7={?5L-{%YFI_?zNjfAZK`zgn%2 zd~&6PF4DSte9@47mO@;BjWdY%GQ}_x-$;YEb`Rd)onY6!doWY!IBDMZ?UAc@Bk{`a z1ctYaK%5p>_u-2`yi#o57N_{8t7inkff&Hs%7fTL5sbVZj}*wNy(t0Wd7W-uK(O2N z4v@5Pe7HooYX!VKb?>=XsdruRo_mXvKK+t+O!e99Tzy>~-PcI^M-Z5VeW#f^&8`NM z)m`awy32q&3-Dx1G^(cI=dp!y@%zqbUC%$Q5>1!y{<-CsShbx=D9m~{ZZY)T4rC7!E5BU$?~_l2xc}ndX<9HocG)U3XUNy zBjF({ZgE>~ckv@GbB(#=o(zZ{LEwq^efPw`{y<gXoj;Wu0pP^Y*d~UXVYPIWR%*%VTgpuo7#5!B6P9WuZNtOzl3q15}2D zRYCiOpvzwzjS2e$DzqSy;-Eu~*Nx6RT_zTL0FTY`P;;8uY~p?FeAmEuqL(SJ#jOU- ze#T^eByL((4TUjR0FFU9nOsvb0~|vY#^R^`elXgvCt+rls1NE)WzJxFAJtT5?P@(0 zBJU{No8qgCGBCyX4jQQsVrKdi;wJUD$+D_tRvq#m(>g_$H@!wX7h5$a_VWw-Fc5cun3plYfwHfe%9;3fOTD3XHC*(_?*Q8cS8iDElCAeM`i}{hrcZ9*z&U`lmG8?b)0G>3ZE!s zzwRUP(b21gy9Twy6RCOb>vmlUzKHazp+3uOro`Mqu+7&C)3mL#1>6e!WHj_YiWX3M zT5ij(udXC=5?v+iYuPX}c1+Gu9B&HqVA+q>d+CFHC=t7nvRS5i`;qzzVVeKHdPc86YYP4!x4Gs=VA`V1wVm=LyLJFRCVDB_2Mn_!8*g#&d6dqT&b`d zTIMqmSC}!+q&J`i3iE9Tl)?oIfE|QX7^mkk?hxk~FkCupG=#A!=g&^!tK+;;5NaKIE(N_U z7X**DBcYG=yIFUjm@=Jc5wN(#Vvy$FE%v`lkS6F?&&ggcV)?tGrx-MuK2?)QHs{1zzn~*vY zVLUg>Wa_!OzV`Gyb^4gVeFcN$pM-$C0vw6)|it9}^T} zy$>fQX5NZSE?<`4=&5FLXXgW=0pX}i)vvPL3Om`9l^>b}+AaxRHuH_e(W#y`oIk)m19njQeRB$p$QW~}uK#50)pBoOA;nw!3Yyjv6r z$hJAND!wVKi;G)LEz@xNk;H68vd(R`7po=A1fe$~te(k>w&?Fz%Px;y>-_~D$ zw@}vyyXAKunNh!Cm86*nGqG6hoj^Z1nlD!%RB?5h*gnWE&25lEDVN^J;E1`0=dD@a zw4SHRRF1G-mMt5fbj@!{ZVsW44?5pdO z+dOqUw6tP%ll@LHp&CG*C^c1W^3KOO?_}PH|K{v_9sk}?F3Z?=Q%XPs6{6Ghq3x7rihs&pf_4)OFQa|iu&TBx`>i!VBFRf<=I81;8_$Dq4ehb z;PFCygBPy|gGS@IXvM}YHRbi}%`)T_B)MfhD&<(w%of#X!*s!yL(K1ltr2Y+`A`Xp zzJs0Wl3?RgKhi)1izzm|gi_cDgISKn~1S z3~Ns0gIt~g?8$#O=jVSba$bG`QeY+{iBsa$^3WTRcq|L(^VTC6 zi81~x`C38zPO*waA?X!Y*L!a`>P_@{GgHn`W=ebz$s4n^DUm-xMlig;A0;0|g?FR; zd+f!^F;G2xSI5P{s}U&s1W%M@A^AbE7*M{sS(ql0ip2nMdC#BE>M);EY!%6opoisi z1LnS@Tg6&72`sMP3F}kbv%Tq5V7sF52Plg;Ls~`(zCR48W7*UL7S?QG9f`Nstiizv zV;ij5`&cLAONZYppzebV>!{Q)j(Boiy7b<%SBr`@djo=oTzKnhu&gLlHdrdu(>emb z4R#|{AOm|0xGvJ#2>MZM8gb+usE_dQ*XEd)$RCcxuWq!1TY>xpI9fnXqHWGkNR`5% zsNL8PQZYiQ!2=26t5(a}0BjRfizWX>yB`xv^x}}ivtBiR9y2-~nPUT)QF5TWS3wh< zswF|4BgrXqC;ClzM-3`UxTib%EW$4KuN{4k<8DX)IivNM(Hkh*r#$+)RG#a71!P$! zUlHk^y;`QSID3HrF>s+n-R^ejT&KSyqp$4Tm$v$^-N57Z+8c7@xKrHxsc!ZZ2)x;3 zw44-2#jQQUQ7vw<)q_QWBn00cgARcgrOmrfRI^8C!jaU2jVu{3@KQb|<$X|k8Xxsh zU^qc4a!ljSXUQL<4X8Fd4|_$8XY_h8@}_9b{@J!RJJO^nYTIbaF%$r=mZ4Gen$WR8 zbHnrc*49G%Q2TDzqrGi-Hm{4@nHgJ3z|!I zzD>4g+Oj8#5S6H1wbi$uz}{D0E6x*B^tRu&-ol-c93Sc9vMn&ie-_H)yjp;6d6fUH zColJ+nd%MpD4h>sn@}fvYPnbcqL(4aXae8t^sIpfm*i)!Y5$;6zu=XxGfr44olu&Z zO+Yqa*12)N{dcWjN5+^eh0IEkR~?%t<1^`Gggj~q({X~pHD>}Blm!tkJAI%^g0vlU zOH_9X-6#}%JT6dQjtPf|>77SxEc0!~BhcBt_Arp`wU!_{&AF}@b6UCnL(Ar z+9ad06~v327kq=vAaZb>b_Kk{sj3QP$#9YT@<7}EgRXxJRS1qH&&5|PEnVxHj#&X&;k z?MzTB>TV3bZ<)P(0iHwzN&rQfpqRTs_;}XrIg>M!+O0L@rsfPF;$tWCxx-oPOlBm` zeUSO@R-(bQU=GfQc8lCtYoEsi{I5%_Pec+NB=^X=_2N9wrA*Ca!`Bix$u#v%5=F?k z#qlvGjc)N@tar8r7w45CBL=Jyp`Fm$r@Bz=iY7nQfZbIoMhEK!;X>p07%Ezym>SFC zYVa{qKSH1>%(?@*!Nrg0zOp~3{c1nG7@CB4h57v_GMIt)swT>gHA}jcRFvTm(`HXl z1A1YF0FU;=G%jagIcvm5T!1BOpQhoKh*cuLQn;&xPo6FHMZIFzPs%Gnn?0(UzLMg2 z<^ERbtChH3N@BZ8Q{F-q#U)Z z6yh@Dtbfq7|A#|4XMfE&mnamyc|7k(b)Q}A{Ut;fzVl5}Xnr<3WTXy&yn>Q3#!=`+ zLt&bFu!M-yN^yAB+GkYSPTL(*F)xy#@M}ZczDh8v^|hYVQOdDjisMW(&I-(2VwjIp zq$!Y?f0_vzBxgasB5twsx7zMT+rJe|zI&TpzLRWVaY-6gxY`cdMj)(jr(?bq(hU+F z_U~D8qRN0|wMLm{n~BKaLvM*zKewT_fCG5xh{2WstCtC1X zS?io`8F%ZDS{RTaVjG2pjdtlm;Id2_=VA0z+yGMFVdG1#ef9`;DF!07TOd1gb+J)q z`g%4G>-tox?|^*k$F)5VO_8sDZkO0oCA*C?zsuTZB5Usz;M}N( zN#h*24P{Wv=8=N3^ z{I1O{`fJ*vE_sHD(rVl*4j2_`{F=b*({PvKVWb!|H+zC<)GK0s#oFfwz;Nq(lb*e- zliemZGHPYotzO|GUA$W-+2{+AYy!3CAP_(kY!wtn6b=k=B+VpL?Fr&Qqlf$ezimCm zPxs>FsXKPt#bs-s$>ggH^oBh%tar@$oreGF;^yJ~6%q?@sw5(Kiwy6Cw4tRB%B-3c zxFMYb6QDAj4Sa}?C)>qzXa`WxXK;<_bAcT6rLcn`YoB_qbE>eeW%HA_I3t&Mm>{bg z#+1bHVLc@ECPo$hq1|TE?dyk6$iJB=)cq=rLd{Pfzm(}yWBNFLwcM7K%}j!(12}sF zz7V)LU9vf3FLt|)pQ@35#3DoSufxdNueufd8hKGKJIoUChGv*2-LJ9txAl&7E8gDL zn_jn+?>i$C@I+T$)%;Ay6YxYnOQqCwOXxGt*w9W1x*^>hRqN zeiU!Ew~c;F=u<@UoEzP$;=e2X59OX`+xNNd<;wk|3O{lKM>of-J$AJ`(yz0sOL}`-{XZvtH=U?}{i$(B;m)m@^9wW=baf$MrLcEpbq<`jq zY~18Z|QkXk2nTji`6^4w9Jy+3k4+(VjN3&I8-k< z4H7Hy9@tq|xlWjCgpml}86aX^cUXOaa%dGdA9zhT+KVoMf2UMxCS2Q$$dq2&K&R}m zk*>@*TaPLaHDf6x?%do$OLI1Qll5iz2%a(D~d9ydErK9=Lwd(E|}Kvd5K zyzHj=d1#E@!PX|f`d1fFUH%#`cZ26#@73Sn`PtHwcKjz>K5K{1*qZW(@@&t&8pYr5 z(jU7p^c0`rHhIB4UT}klLj}kVvaJvlaF)~-#zU+k%X&rFdxHDrQ-iffpb%}WC-or4 zpA?dz>iS(w{32T>%BVir^x;N9`%f|t$>CT`E^(NtOh`v0c`yB{|)kny(dEd!mVcX!E>GD z!dZM%EZ<7 zxkSOWQ|-rGavj@=JF>)>0w>o|)Gq$JJO&~qiKuj$cj`JC8KS0+R_?PD9W7J)OXVF# zhVLXkwX99(N@nl|fHGz9lr}h>8ao=rt^-ojmT<8VFh51OgdE2S9P|621w9ot5hQZB zy9iPEoPwkPFg4>uU1OnN8w(<1#A$g}+T$Z+x5U9~(7$WMe`~IocTiXWrJcqTcVVaA zT+ih=VA*pz(qLtAoyc4$2G_Oa34hQBQ~4T$r)PBmijF86Y0c(5TH zqj$6I(gHm{Add(>(PlhY8lk!6U!K@CZN$E z8w*F{5$fn?82TB85r0E18h*8aNv~V}Ns37}3=4d_6Pxno!Y->0EFt(;;dFJ?c*3E3 zkP76p-O^d^z>|XEZ=@9Sj)X`-Yshv7`YS{Yk-<*gfh!13iU=}B3~NUdZo<7$$D+5r zY8`rgps4nxMuHJ1r7H*I+Bfkbn+(G>;xDzEF)qC&+0`gbJ5u5OA1Gy0z=0TAJ*dAV zT!jwK>VDGVkbO8K(j?y|X1j;;Es3+EP^nf3`!LaKhsITqOkXQ$`M|VM){e`Sb*bHB zT4oz;39j!}-LNZOK7tjz$9lpot>En;6V{_X71{|_0KX?ePoK(j5R-K;lH91x65ut) z-LSDfzba@SF8>T0hnx0JL=my@m;1_k>KnuF-&l7dk`gZGHw%urkGYbz) z&MumyUOeelIiq`)yKnar;D?a=2@v(pUSe;7V-37O#z|WDi4b1S0cyT8SIsFe$o>!I zSf?giAbKkq4SKUdZLrk)vXko(ia2SuV>va=v!=xm1DuA6Cw1T5rV;Ii^ zrvR%LzM!(7B>^YWSU<@T4;kr~Jv^`$EUe2>qM?bzbxPLOmFtUe<^j+8N1p0v0p~LbalK>sY&p$A%p;4je#fDsrGXf zf)RD3AzGpHFJK)qK{iSAah0H%Iq{{Eva?d$B(t{|pWC%EB1gMn#0B=qJ^EpjYQB)FwSF5!M${Pm5&>Y7kWPU55a(C|_9n^#WZQpGDDV|tCC%7}U}+?= z|2yii!pWp1!};Y^7s_wQ3600-DPrZ8eEy%Bp3BX|~^>y#^{9jyCFz_n%bjncVY`d7*Pby8j;M|!kM zs+BUiNn#+Pfy5=h{wUrN=suGwlkwt%6$*Ot z;mFi@IqleOQhp@FbO{qlj`)Get>hPzdGhh2vE7(%A*mA8>CJ*WfE~aPAR9J;IG3$t zDE>sU?D8nhh`qd)AN!5;&Bgv&V%G}}LF4*GQv_sRk(iZj?%=lCEx;aOsUl6PHE1fp zH&bpNYl`}|gsuGm+(py3n)59-V1B#xB*7ONNLbKfFD&i4b8A$4f0C%Q9?5y9^ZQQD zxf>M~=GHaVcXBM|z4&(Bq2K29IcmroH)r@9l9b3Ej;E zrVu7lyE&mjiUtkwJ<01QI^DR1T0FA4Am4C7blP~_T3g&KA#_xsm~grGJb?sI+*#(F zzo{HOlk!%`StJqLE&BLU_(B=4;cg_{N_Q%i)1`O=FG+oPZdILE4N`yj3Cej|%Bi4C z)_`pYUn}b!#g%}b!z;=J<*yOmlTyDeuuJE11E%0=bHpEH2-lHs3u@;01X`D5Kgb8~ z=EXaCaZYFz41nEZ_v$B4+P012 zCS~8@lpc0WNJNA7_ko~Clvbul-PeBlbeQFH2nnGU#`S47v^MmkyaP}qdPmlK;MAuC z(+Oo!tce`Q94Jye_IYk9;+xA%|!>`VX5&-n2v%SW1yo_DC*=yY31(0i(E>h73 zT&3A|Hb*ILllJXK5vf}Rw_${+!6@ZqB`^1y*Z8^z`J#&FWK`S|kIlK?k-4oL4?IV? z!M$F3H_)Y)36qU7HdkVqI8al4T$xa(HvO&$nRSC{wkb=Pd8wJEC{yba%nBpfvU zgOV~0yV~a|wYU9@R@>OO2z#Q7Xqu=Fakj!FGYFDHkY>LC>|BSx#NZ@Dzr(Pv;Xn(a zBPGSuCG@nh?+hwPc_h?j&iIbdiTcx3UW;mlT%l<|(yRf~QTb?sCOMio9XrRc? zYRaNo3vLrFQELIwP-)Svhq0P>wC+TG`kJp2{dnV{5ChPpU4mi={t&=7{2 z*?VxB5teafOYU4Ahr?U4@-oWyzF{c9fSq(|<+bLmxEWj~|eE`GqI zM*Q;z$tqd#!`r*qz45SHSlw1xk0B716;y1wFuN_2BI+EDdw$$^LJDQq5;jcM~b zSri5NbMm_YSl1#y08DFE5^|g7Akg`&1sxKKO27k# zzo?!h)eIA#tqklT3jpV|Nt8ll*5#WX3lt*DxXQ!oxDo04NvglB2Dmqs{pi27edk zg!AO2Ehk(DtVX|Wt9R_&HOju$Fh$$8C6508&d0fOoD-swWXS~*2=~zO=+L-)KMzdA zpqo_6;lF%Bq||#Ta32gpw!UD(NHhZ5m!&Wb#t;*VIG%Sv!Hivb7N#VI%4jC&ehu`yb)8ox9hd;4y#Eu*1xgsn{08TDQU66_Mxz6 zqq*MJ8_3M*25=L!D)i8dt-KiYK-Rb)bMVZUGvp}~9FBEfJkF}rpM?F~H#JFPP8B+E zu1$!y)|0%O&6#wk>#0`e=7)i4#Yc`_!QP-(YQ08_)dbkdCSIk3lYmwXi}uxNe0@)Q zwjy%^94UIcnr~SXu+a?4yvhxFfOJ8?jX&lklnao?YjWE(xwPG8BPhQof2ZG-;yrn> z{jQvC4b8>y`mbnSD|@`4QX7|g^Arbn3dpTx^L9Nbi}*a-YhUJSUrr-=>KLv`$6Mqxrd)0uh_=Y4^+XrW(?vP|`e^PWI3As(OYs=gn2Pe(Kn zP&6#`Bo}+*nS!-xabFpczbyhOwC9n7o-eo5c@cw*i`4{f7!vP4fU{GbQ*ZrxhB=K!5X?9^(RRjST{~{@@L?R!`F`n z9fY7PjK(Q~a~=15Cu7)iqtK0gl0GPl0=DQ1XobxQ^I|@7z-(xP8%!`@_pzg_p$8-Y z@OmltBVf9>QtBXeAm9Qa?s2O3JGoS|a67}HU~F!*ny9;@{nbQoJ2kyR!c*Yoc7j*i zvTy_!1kZEvouQ?%ugqm%8N;zNd&|%yw42L>^>h~1AEB+G@Yic2_XaeTQklrLjNvHL z>{>V>NivML_}CsvhkmZyQ;s)^*d)XdCo*#A0|XFq=oL48n({dJW@xtoJxccIUdVBb zAZj&F0YqBIP(elq+t=RiRC{_|L2kEPthBACb1e@F?*aA~8}qTSF{kg%$@^mcU@X_? z5H*kGTA*q(G`7JFIZa_M+l0aXiWfHLL5V@eq>S6uO+wuxl6wX8U?jf9@-I0MfJ^g1 zzgi*mjZ7NCO6)V@!}LU-=MZudZOas!gY`Waq@2L@IdhG>^T9#-K#uFcsj^?8jFN-L zl0+({kK&K{xYX0A85b76mu?mtnoNwSNA;rC z0*Su z<}DPx|uo*iSL4 z29WraFaP8xPx|5Ge*OucXcO_1%o~1ir>8}Ha1JNj`DVSLPEthx~>XwxE`3f4;9mMz!vxyd0n9_-t;gY?;^V_hk574)~+w z7y#u43JK&d85IuXM@@q4y#u$T0rcE0o>g}l=={GyMYdT(E$EMBj$cb2meay9ZcoA$ z_p@FtvMc{4lUxcVAsWr~ndGJn8zsIeKPWORW%4$miZpOBBl4YklbtE_bUh90EGeIq zO-|0rIfuw-7t>l}QMYAtDXB!{HEj$HeB_2=a(z+VSuEO6w%D2541%dPu+MNV!!-IW zd95J%)ZRf=%$F?)t}>3vUmN25jWGnKcuS zCNSxMQb(RO)LUDIsV=~hw=OT!QQ^N(Vo{w8^jv&cG!y>wQcytG=#vA+m)&ck#wyQE z3{pPm1q* zI~%xTxI1gaMTFLg8lFK6vBw(vuS!P6NW$04Rgya&Wa*GTOgc~Y^vFMl&F*X1>hoaR zijs4p@Hdh7Nhm)Kqq8F4Al*Rh7{kf%d$K&X3x+hSmslpwK)Cw=4rfWCBIS!Cf&Dpu zZq`08n>gZcIiQHQh9SULxW%q?n9SiI z+muK~!3-W?rNyd{_j9isA)BHnpBIbKa{no1MMP#wP4>+ z5Z4#bH*Y9tLyBhmXV)`rZm&0BU|R1W3}Jk(GZX06dhtLZrE0sk5aIfP*zj=whvG-# zKY6^q#oO`vQoq9K`l0w!`uk_=#ouecf3=YL-#}#gzZSCoG&L65;UF56Q$gA-ld>DK zs}Z$wED8dYb|^Ff;jK|&Gr$BBb%RPmZBHcE<+l`SbBJYIIfm?vfElQ(;6Cgj5yjQ zDw0Z&D7ah<_u0p&7|V^$n!Xd8WbLNikAj`8GaIWg!K8n_{(Xah&Hs%C{gx?P@E6mM z=*0$~R+<`MKJmmvmWc9XSC;HkOX8Fg<8*4tKc%EkEm4KU0iC#-oDl4VQ%f07EJwOU z7dMLI8d6UAFYCqX26M_Y8>1OBHjl)Kc%zJ_Vjyx{Xgq$m=`f#6MyKRAqo?*% zsy!WHt!k+nuv1HGyW6Hc-7edZORey($YR-dxwU2SOf#+D)EsWtgx}Nl+^yvV%=Phd z6d5V~l#lh?U2EU?aAoFXJXcOrvSF&fYv;G+Vid&#>$ zQZ!M(#j^B+6)gbSh@dr@Z{KOol;Y{RJ;w$kQ|GHxTeuG5GAT|L5^2F#J#hZunPJz4 z`iQ-xT@=&F9onM|z74=3`X|I7qX>9Ol6lSHN1doLjU3gmGab&JbSO({0{Z9(76@{n z4EOlZcxzJ&OVE&n)t>O;{umE#YfHdv8J?hXYhyXyx}dfC=N9pFi~D|y{;0)BIk#Ag zX^Ah=E*{?+K*mM-mtmHwEeN>lSrD!8QGeZKHaG3Wc(WdkGfwRCe6BaAcAduB(^l4_ ztyMcusbNarp^%G}EoR_;)oN-3u^?Bsa@T&>>Su!%IN3H|?)3C>lW}zUvJWUG*b0Lu zXC@Ku=F#1XYfit(Lq33LihuYq5V)!ue+l2_u9`TM7I z{vK!_Du13La-I;MsnkMhF?r1k`>5J{iEv8#_tLssccG{VSq*Tx;W3w|+0ARxLU8V{ z?Z$JA<;U(GEw@XEG?|R2?9Kke$hD&?5G|>8-GMtNdyZ`w-3w>i`W%X3kQeB9KhSCM zZv8`z$wvW#IN5cig*T+Wmih8RDR#oBA44LXgwqV+I{r;}7F0NGhO1K8;WpW9 zri%oIUQ_jtf&kx7y)C!lX2IKXwn(2Y!}qeSweax}H}4o+TzIvX>)ETczfyafY}GEe zElFxceP(+=@XiumZ+w>+?#hE=w718Ea3a1nH(!j&%e_qTKf0^*hHcQF;8m{K{M+k5 z?gmbu8d#{_M{7~<+4=V|oqV!|5HJkx8WXqE(Sj{l++`b&x=!Ii4-)-hfKs%CwC;QJ`NJKbA=x5b->KYPbb5L z2^<`Cu*dUQZ6)k^JO_G%AY0pu>+?WBaoVIGX1)h)V7{C$b(9-Rqsm>ScSJVMc+~@B)J{l~gNDq0x7;Zpfe^_59zdPsg{=HVNT^|?F9fPfB? z@@A*E+;FMmCt|G=r-)lPBTArdqjX^WH)ZD=GJcCm(wY%efxcDM)xLO{VO661l8j%G zc}%`uNj5hpVL38oA4yg0{|LKN^o#9z9Aob->Zwh+*lrU|*rWV%HX42r<(}xakzPdD z2qOZi2VJjxzY}cjMDic&%sY~e;>?~L6pLZ}{8C*xE={g?6>Ryp-R{1aGPn5T+@O@=Zt`@zrcQi+V zdW_zqo+?M%LckH3Pbqmg{Ha&g^E_YAfNNf;sTh4IJDETD9tFRe4VfV&&ivoK8Tmha~8v+)`>bQ=KH=q=J|)B`ojWGD+BV zA>fEv6uh6qaZsbzFwoox=m=D9YeIO=X)CsSZL&RVyUT8jpytXnM2(4;>sTqFW(m6E zF4>#@uCLVZ_UZnxZ(o+mlBGtQe8w1?3tJ$*cAN@KDjv_~wWE)h*6{(vbzix~rJi$* z2Lbw0^2XGSp0~ksPV$1$cDqAO%wKyvf(5HXDRXsxSGfecn_;PG4R5f|Sd`7M4;2TR zp#}R%N(fAUWC4(Z28kp<5QEf=xgJo-`y^1wB^(LIi{fxr@KOa_@M1~cnpwl{FT<7< zVNB`dAUr-SIMq)?jO&?nkuQY)FhJ^=RD|@ z^NgoRFE%mpd=T9nRyTwO;+x+)Q{7qitPV44@K%)XbK_gxXiIQwZK~b<)g&?ZOI*4? zHwHo*NYM(M1f!7e^at;_&2C}Tn{+a`^%$)u7(e{^0#cUg;N=bE;yQ7+T5sapuM^)! z-nTLI9pLv40#z`EJ!cljWCSuUS5?P!nT@Pmg4~;LJq)!rSg>cp;D%*Leg- z-VTlM|GTocbuU-;22U-Eg6EaE%Z|TgA5uOQ!qs4P9N%Qe&wIJ&y!bIs|Ir&hHLN-7 zJ$G*GXw> z^XqzjXyHPNk!s({=CU#|Nv6@QB^CFC7Y6%fd@Wq}_-1;~ro09RAMBAHTl zh`xHae9XB^in}4kyi1O<_Iq1)7rXp!uj>pWe-hRs zz(?y_Tk5Ab!b)XNfkYPymE8>9#s3FtMfjZZ!O~sH+HcsKNw(MI9zB34gV=J%(Xf*E zEZW^i5~7ZfhdW33@RR9-0lYC0R|$0t)_jovUOfChKDPcMnO`AwmmUkoa8TP>YEFmy z$8*E~nMWQ1F`iny?j0nJWj!G5(@jZ7d#2iovgZfjX6%K=w%~xh2Z80B!TkxA%vj8b9c7(J>W7wX zsvmQK%%wyiXY9d!(TeiceyxmWwcCcZ+U{z${tZJ9v3&{MOFBl?KMI?o36#ZrN(dEF zL6G})h-Dotv&QZ-EvynShaLp?1gh3|QWeXnSuNH9Hw$YQTr5D?h{rIcLHh%QhxI*| zG4kTBl$dC3Dd$Jy@lEVSDi_VbJ3JkGsC1bM5S#x|?v&g_wN2q}TYja~WTKZlC6mn- z^@Y-#HjCo-Rh`j;KUJDft3f}!kUJoN#z3WxRI3od3SL(6jdt!PJ2}m6v#bZDJW%$^ zPOvG2D;>&cwJ_!OLr#s5_`okft zhA?Vy8wTtSzKL=qc$M(N982C3l$FpIpDmKi=+hg!N}{-$1h+zb~yVQR5|+>Zua zcbpOj*7lsQq`kAhNx_#{IT0+Jw@$fNX!~TTAv4Q$01mJ1^dsiaHOdFP&0w)j-KguY z)b>Nlp5Skt``3}+{7 zC0s5tnS4;CGPu`{PdKg+ucmZ5B$3hNptcvF#ccU_NNSjWq~uyi-W8Utg6iyKwn#7^tBF- z^@4|n!+WhguCu{-;)p>hA@9f`icLI3d+jVIutMZZF>0881_(Uc9|y#r_bmB5?h)Wi zlo-g^vxrKfGrJ?Y!Re_x9Hi z5GLGy!_RAk^|^>4o-k1-JT#ETL6t(Z3D4!|3d>5zDnu``^CAd?ezk#Ay*>>8rt)YP8swfAJK5ECBEJFQ}dMY4sp$7zgJ`4X|S zb%xzUvj{6;L^(w2l}aQM8Mx>@LOv{_R_`@Iq3ZIjL^+at_^9~0fOh{#B{Rb}4C(`T zNvheGRWs^JWJwhEJr2E8s7r*G-kofEcgB3}^+fAc^7k1SIAH*oye-uy)ECz8%gjft zsLaRGeNj5>2vC0+6MDJIoUHi#m&*NsI;@Ia7mcn2L1OHZ{sK{%CAg?{D83E=i!cPa zcpwmgsBsg`4mk_Q`5s4E_d4(v;o~_Uu9kojlvWpe`acaZQ_ zFgT9?$eaJ@=RZbUtC$OU2S1zi8ci+N^Hu9Sy;Ftuj+2=I-Ng2n_nLIUAJjyH6iRoXb)%th1j@MuPvyZKbw#g78N;VUCRMQTDy47-RvW zW&)}rID<;hE0gjMu!fB<=!p(1?iciw+&P=|)az0Y(?Y{E&?7Gs=!vSq9;5gk_gw}{ z*j7h5Whxdx_aIo)0U}Y3w-$}JR+u<3>(4Amy5gXR21YdsTE9td*`nfJVo!IJKQLx5 zJkz;>oOOd;d`*crmAlOLSJ~ah_y3tR-z~Mlg&XZ+Hxq{6oKiLhk2DpE&H3hh{d{F} zzKHWZWfxDf#R}WK#P%=8XKd^hadw)ob^*G0dd6lv-KLbz$XTf=Gn}Y4{RUIRXVD)F z6*aD6R07Wf8Tz5rEQNRJ5%`k#WG7ZJN_QTj_01!8Z7Kw|mdB+rh`o$G!XCyXuX{qj zA|Kb{2^~F-6Jya4wU!spAYVFmgHXqOGk*wV@g{HQCSzmkPAOMeXSw&;xVK z^^<{K>sj5tQj1eHo4&qUlWq$d(@dipUOTxIeEx{$wuAN@r`k%N|E^2!K6XT$bX8uXVDeu&~YMk$xhL zCgZm}!7y*M3cfgo8ZT6!i1pRDFG9TZ%Y{0?tEa?e_9|H=6|kV4MM(z7t+>NrBcuD{VD!l5ye{3Ghgc>V zNbsf_h6Cpm7Nm){0QX4wlsCYQq<@+=iHwI}NgvRcMQwvVg6xC1Rf>xw^|D8*^d&I< zAY{90>!B@`fRecPMVQMSTPDlDhlg^&T9LHh5sSNH_k~!$ob~~Nd1qJ9>@*pyB~AWE z95l4kAO^INtxaZp-ff;N|E^8X0qdNE#!#E)vCY%-f^_9ohez%Qwdq;3u1u;g#p0FN z{UX+1rWYh}hu%|@Ns9lN3npL2=|XHpx*aBRUk{r7Af1}zYy^YjQ)%96?ezm|X3=gl zabZ+KYbVrt1MeQ3$@g>8-)v>=^|G*j!t!4sC=x9VX<;PHd?ab7nv3g zarGQWGPcj!>qKFlNt`A4Zumd)yUrmff_C1|7!9MQbbQY!&eK7f@=0@g1xM}9S*HIl zFwVU$5!Pd5D;TGDi|jxn3gR?l$N)f3!qm2`DRK@s7_Ie8qqQ21HR7mPdur83gsoGiDT8_2b?-O6;v#p8bG>xe{eUf)VSFH70nJty|reQ71`b`oQK3Qi)xR>LcD*=ey7b$>2`edcCA3 zF0>xpIHMYtH_8}|tpcfRooY?)k@3BfDC9ug9LOW^KIl1_t=Yb1y)#LIS=s7sx!JR! zzBGav_F+#zCnLNrNNI_!7j(j-7w#|f4Sk#UmdntJE$aZeM7$v6PeC@xo#p*PY%dy} zcZKF>?WUOwHy|xFgFSf)FpdY||B74jWp;5ia6CcXUR)Z45b^&WY3+3+v;mP*SguCM zbk0z6tzBg(sDOG6%0@{bA^ zs!l*4-lsNuhn%MvcZzCYTbeiwv<(= z_-sd^F%V`Xhdo)f)DTS_=Tu8oce^E!cod9t9kP(;`A5nh=^gDIwnq}Q!$jyqjS(`Jkf7j)bNVNm%=07>hlvJn zmC>9bQ{?`_bct03OGr#e-Y-)N{RQE_lKOGP1H#+KK1%Nd-IPQS*eitkru?yc6z1a3 zM%wxxR)X1a+gXEcXpVF|A@vypY7J9aaeIJP5M6=F?IX+`B;hfeF7sg6BkI3O{VWPHLJx%8N;=T5c-pOq@iUVd8zl@DW@oXwm67 z0+0uh{eZF`Mg<|`FY@qca@Fx{{#t#{2=d(+!?tNa8tjx{@86(r6BuL~>rgw4rgQr!k ziKLKSZKf~iZcy(|c_)9~Xqor%bxg7kP&~~?E7;Q-U_-*yA?@iq@}E8jpTTQyBBj_J z^q`S-69BYJ-I?py3--46G*<#OBBn2bTx5XsOEbmo3x&0T7?at;F?90&7o^a5=S3~D zyI?z`Wn~Lemb zMD-X4;vRFxxp=e_dxklWfwyRNu-SFzvJ(|hj+XqdwT=y!8to48Lnn)ZQ0QPQTZ~o9 zw_97kLg3@{GP<-)RY8$jl&xchwd7)9Jt?6F1U(DN(S}GQxtfgLCMW2DgAynN`)wl5 zWJLPxpIX)|ZjA{x1@vO6I9nKC)`QACjsc#vWSJb@AcDc>u|Vw!0rzqwV~V4TV`54p z-z7%JV_K~1R2AC>>Rq@lO;zg55H1$1&?@Mupxcxi1CKq*q{n2YyFGkyUVVKi*20L! z!foR-i2OxlL(BV+BTqDZ0WdX#g3mqR$cLTeA*V=w;_uD=?bzqo_Sv{|DwE>rhC>!! zq8Y(VHm;L|JK5c(U^r`a>{A;fzR?Z0O!qTV*WOWRA2UUdc$hRcInxaNGDD_nb}O)V z0bN9!H-KR5Y0y^*Zq;HKLw9wT0K{RW;5`UJJ~p0uk}uHMni$8(&6_jMYH73%YBi_QlgsAGo7`nB zB_SUO*3Iy_=%?s9qVJw`?mrB;7La-ys&QWN0wtK4Xbez%wU&gW|Df?vc(B?F@?;(b z%Hd?f^+rh?kHFH_TRMi+G%bDO;9Qa7tbMW7zS>X05hum3hTo7Ucj~_C{k_=;HVXA5 z9vIspG$YU7*Zb|hJn|Lc;Pk7?|KaOBz}%>=zyG;+=FW^pqqLx&Jr2#|y%@c*3A+VPwG z-}l*PB&{^k%x&kM@;%?fN5Kn9U$JNU@;!|ubpk9<8(>2;fdwd4Nh0PkuBg=Q41jX@c0q>kZ{nRq&YH&>O=f6u}t#uYCvG&Fl+a8swGpKEi`Z0Qa48O z^i}2TtjdH3v5O6VJJEzevLPHfGQ2KT*Ne26w?D$Y2|~o;*qiOQFAi7@i4>!(TYWMC zKJXZ;ll@St>Pj}gqs|fjI|E@whWzfUefv6+UWB_!m%>S1rw74BPbf|ZV{gw08fLT| z6Cc&*>hJ0^i5R}fQ_|X~X4d4Z*VxtoICDG-sT1A&@vJVGpn?#mTtd$wcU;&m0vKX@ zp@ndqew`tj+QSaAwU*9Pkr`UfcAU~@1LU%-nSdeqS>%YmR(&UcrucX8z;2YRrA{>yCP2)NpnYeq04WY#wJu11{02->Nj2lzQ#f#u{*E zHzspDrodKE*($Qb-o@8lt#{DpYjr$#R!wjY7Whgupa9mQX2WG^+IdJg>wxu&tcVi8 zcK{`I9l(3MlF}qdGp%N49OfevB}k7>`PKnDSU+PZgpef`M<|LR8iH}de~@KPijV0Q zV7N%pTU7F9sMilbJ=jRmPFeCXJq0@m{^ATje<N zLbO?CtpgBJUo(fwSP4W_2!nRx{K(2Aq0(6t+JBh_3}JN1{j(nLGtqji|BP780Y7CF zDvmo$9)2hfZ$$s^YMn{A!Gz@w$-27j6KXU?Gp|Fp{X5 zhnXKaN{em*uyNwn9FWm)BH)pAz)8w_+rTO;06CezXgEGKNeO?;K(Df_gLD;VpQ#qD zl@z3fJX&WU$XzsqDrSWY8>@stWG~E*d~E~W+r==FVnzSXds@w{whpKj6C?=JwH2sn zZxWP74#R77E%6sq~(owE>w1l2vnk~xQ}ZMzk;H- zH|wu8;6_W0EAc@@Oznn-t~xZsCXE;n%x}ccIv?Cq;MI zt>x*w_HABc6AVuBxW)O_ zw}^CVL@}9}!H$un{E=lXaU|mnAb2rz|7;Rx<9xq-p|eOW3>J9{-9?#& zW`A>!QWvRkJ)k~QK6_!yqF)e83U@Y(AZjd+TOT{+_h<+G>TYJ1bC>pbzC&m3)COPu zpnBK|H#y0x9dj?6YXYDX_u!~2FoH;)xtwj0ZC4XNF0IFy@^LNOAYMFO1%Jj-j(X4u z$dJ)kSbAY>O(L%Fm21ob8wndks-JpoB zSJR^2FuW~2P!8WpQrGWdrsGUxvCyK|6c8QtJhu^hPS{1wm)dWDEquH!Aa> zV=g0aFWPS|$6YW%@2kG&?1`%B?o7YbIt=%IQNN_cEsf7&5&bcPqZ=BeON&19X~{4V z5&O_L<#a=*b-tTJQ}?XPMxF_L|5Xw1j*T2yxE(jCJGFHyiX;=ZkNpsI3#I5|P8#Ya z7PSK)9(@&4rJ*y(qRCQE6fU1KkY(BIze_J)5UGz%Ob>$HeI}(~Rz z!?a=2&DAIuGM6eL^~2@PI%6|LrNMDkhv|fq^ciu-#$fQ-M7kkp>S|V!Pr$DLa+3{* zm_Z$KJV*tpk)KK`5R&}ND1EFRFVLT0b~5Tl+d0}~|e$6O!F@)3xA?Wa=lXHx`g zpG%q5G4rC^eIGytb9&6Yl2R|HoYzy%%b2w6sPR-2A;;;W$q5r};HH8^J2P{L`fj{e zlN4^M#)xZz4Z*Flb9gSm3iW4Fxz4T5tVg3YyBhbNZZtpizh=jc@!>2MJ)j>3lrccx z?2hmdND0`Axpgtj*E(X7->69R+@#tk+f(-BxL-{+Q(jZNx{s>gK{*&KryXx7wx0TF zV6O>W7gGznJl&$2fhwSVi>Iyl2}P?g8c|mZPMZe@fzul6fEi^x#`J*K9}J}W(*yLy zU4eNdAil_a6#7-4b<*L(!jz{kbnIAVqGG+8g zxy$mcQMD%{tNbDx57eISQgN!+F{NxZMd62IE!b*D5F+5p1WHN$gHqTzVVjPnf;7Cz zCJt|>oIVDq93+o+J=-DNR5vI*otxCF%DOC$21R_h0ac@##eh-6DB-&+9l3=N3R{`3 zqxE9l2Npo6N-prCteFSh&vYX{vo2}fA0JD5N|NLxR6+lrtjALn>Q)DqPwae(si&oX z9J&IqSUD36+QKqI69M|F-wKg0-j#9&DLvLcRhcaQ3h;6;YB9jc7RaR_*EH1qV8K!s znOp+5mh@^_DK(q{F_|$(8e#(!^GIvkzleyKq#-iRl#KkAEcP(z1@%&hZ+gsy>H+ zED7|4?bQLX_CNr)i~W>okM*!0aqz`W%C+uJQa7iYm)+KDxc`JVm`&T_U+v60ZZ6_S zok;N{NU#Utr2`O3d(jz7)ZwBvO+|>zTQoPuS>Ln1O}6N6@y1gK#;H>kNEXb?BQY;8 zRQu#ONxs!@+Tz%Og`^eQ-S|6sML~&pcmqd4XQUoqfS$X*GbIv;QkOf;nMBuaNKa>a zrs29lTP@&Zn(j2BlT~^t&K%q-`y0J6R|CX4@zgF#+Bn^C_PLXq&@ zOg>QWKvxo;kX7&ToNn+S5!*G2UrJ%|w<1Aw0CVMCrH<4W;t63P7C71jSv4kdv&~*hd#Q=3A$b7jGI8 zjYN1Z^6mA2#NfBM(zmbTRp_V4@r>?GCJ2yhR#TTVmyHq{Zc4Y{lbFwBscWiL&~(Ub zDd9(JtyfBLe*f0DpX5jIMT$Mu%7f+s2S-F3@TU5W_XnjY3KBiut^a_B;ovr!v;@!c zsruObkAq{)kELCW9K#&*I0kq>Jhtk`9d>rL%KvzdvrgONte0@jq|XT5)591#tFEg@ zNY$H0s)inFz5xUtcjlE*=V#ZT7L0|Ds0?(SpG(F{p(Y8{<#zrmJGjy|*WtRuNrr>Z zoEwP*UVgh5rTBc%3sVh%C*01}>*eQau6w6G6~w3=A-cpWNEi*;}p12oq;PlISXg&o0@ za-mv18*?9~=$v*a%i?4l$wyVUd&LI)Pq6`ac-az+SkdxI)Gd+6ZZ68TF+J#VYn8p9 z;nObecrHskQ2!&hA+R~8XCASHgLlR3$FC2>0a6b1`bY@vgiY&+UvY2+LS^Elz&iNX z&}HLT5xSc!J2yo)NY3lf*=D{_v{o*TW^t{asRF8RN5KYtO3_Jpo%v3Dg$ts`eDs)! z9uxo1$Exoj?>zWwRj{ji3%M$rQi-}?4+hw2F%@ykWBnwVQu(f@5U=w1G%ZRE zpGwhD^rewckIdIGCt=1Kd3N%J(yO)g8i6Q@BBifaoi_k1tI)}Me>Ci9_Nj#0f;u>g zRP3=>ZbQtz+BIjmdSeWQGPy;ed@ zjKwd2xm#Z$UrRrm5>qK<_}WD=bC+xGcCpiLbRE8SZOpzY=KL}iNWeq)xX`Ec2ESBw z?<&))f2pv7(Cu%F{_obeDRaAWZc_z5?Zly9p3KD(zT1z=T4rabCo7VT$+BcDxn5;D z<3H}(GD3IY3Aczkp)HLu&HfCpi-OB-;q-V{vQLlI^_i+{WhS5g2)cUY8~DUdwIho#T`y4|4c3Dc^%!=(!d9c2+p?rMc)Dzm|Xd^n2Y1K znvAqzGv3caJp04xc(x&5AXaIT6N1qo5CRF)$FY3=Nv>R zvd;!zBiRU!T}f?bZX2^nu+JFg(3qmG;bR9E?YYD=qym+sa8cqFyl#NxumLKg2f~CT zvkv_;jzc^0?eXIV4sg6jOu?i8{)>w0Bau+LN8v9<&yzmNT8HjtUBgd{*#O*9q+*;Q z9gWk50p$|U6)#a5UE(Zl-D|fvxDVmql#7((GRZ_5RjZIyh79u~t=ChaP8r3QV!$VG?usdq|!nL|60`t`MzpSEM!X^kFBU zBq!&sRdYvKhdvS!0fW6sIeSQblB(d}c=~IjJLuJW17c?OtmWUR{LL-uGy7(gxkDc& z>ke{8Q}Y5K38$6YlfMKZF?4zyG_A293)lmLM+&5pmd10r)TDXHwI6WZjjp-RJ&rIP zGeifIM`mwQof-{ftG<3@~z?Rt<7kzq_W`V(0K44 zaBdb4{wFx{Q`YeLYPr24zT8{UcuaoPyN-1Q91+IPhOolBURa^CpH6jNo~mA%>dtcJ zs9#U9Kb=f^#^sZ}_dq9kFX;U1+%=v=3=+?!in?wO4W+pG-=}nxFO?0F=wFl@7t!Tp z!*n)TRxvuz<&ee)1%$+b;bByQo&o9?L6zyur0RDaiHKFIQ-S46VAisZc9!Um9m6LW z6XK4;D@a(`riQ8KHBu#nypu4F=1wr95qUE_#=6Xwm9IE=FX%L|14}+e? zH#idUPtJQyLAWtI>6o%rsfi+ghE@anVFzw@^)H>W$DGuag513c=Xy$GHZ>dvP&7`V zjV&wdchN+cgd5fe!^PW^BznPRLsQ{5c+*9_tVOjPZn91=?ES@^pM{C3$GG%7Czz#d z_XKOW=x$7_qba(x!n)U#f25qZ6nZq^lXvj`sf+#iMLtkN)_IKV2y#Q{2Qf4G>~$O- zX~%y9ITA0)rifpXhSnf)%q>6bgH>Gawwe{z@DHuep@|-J1CL2R1=B$M}mQ6^^oYR_&k^6$W=$lYA2ZZ zgeo?12F+%9D`CSwM-dGtJ(ZHP@!}s9BiX_6|FL4az29hY;C9xv?To94RJ9CTO+utc z1)d;oSJY#07I1eMw-xTj5s&Rtf@uC27nFExsRj6k8@}zzcg-8dY%*~>o{82Gz6e%R zF?e}BKJAy4v%mdM<<5>=x2I$CZf!^8yFH4g_hFemQS{r+*v4;5Gln~@n>@)h^{hKb zo)PUexKM|?t^0W=$0t?;IxiB&nKup3!f@v?*;Rq{G-m#`;EdfMxWkGK$oS!|Vn=UK@ROU$LPb{o zPYsPD#*gVFsPE5+^M_~nCs6JL+=LhV)-(U`=)!M3T-?V?$Uk+8AH=*^R^TdQ1w@i} zx^%nbr4{vz4GPbg!C1}WM5GX~>;w?Yms!Kr6V;C1bTc%ocvbG#uioIR%Y5%X-)!`o z@eKo=yE(cD1u)`U_uZ3$f=MiAjIJa*HA`qkkZa;Ow`YMYNO{CR1BkFntziN!C&In% z^&>e4Skc;UcbaVQY4~nz=poy1b{7FuV#^*T!f_Vi#>mxIf;ed{m~%D& zZy4^Xt*%=|JfOfDjz~j?R6QQhH zzaI;RbGj%d3b!HvpR6eWqm7Fj1FN)=3|Sv?R4*+ByLhjJMq%-_WAQD-;u}6sS+B** zUH6|8lK+?hR?ljC?52<3G~q}D;!8DTY?{0`3cf~%ebtrvblIl!co zaq}N|@ejSYZvLYee8e;R7H9EU(CjPR6zn~zHK969;CSJ={6F9XbI~A+>gFc=NR~B? z5sT@+N`!nL2=}d-kv2aSc84CCc}UO%9id3vgQ6L7ZxL;LDXYHK8Xk<~t)N96lv<2>n9a>tZBgufxfX{oHOu4vSG1hLBj3Y#08=h`T?qN z!Hdi0ca&KAp48y&xlwhaT0O3;+hLbTOPDoP5?TDQut49Tk~cF`dZp4;lJi%q-DH_w zj zv0Lp;C6nQ2@rfn@Q!@_iP9)EVJ_-7@Td#9lr2fnSQQCwsU#&J8Y0~lR1P?1T%kY@$ zRTW+-uC7&s{JVU1eok!mnQBfcNSRgE=46TEGdsrABr-rP()oJ30sNdByphbmnM6pw zldOI>nGL)*Vx>5kK2K6|FG_8rnu1oRrt&{a#c;BMPQ|~7w_beimm&i)mn36raWI$Y z>U>|&_E9442A?H@%P34#2A7@`G-tp?N+;FbY?E{KqsU}^Fv`qr6uP6z@4lj@JxmEA zuoBf^{>UNn2GKT`hj}uy&s6bJ2(eeuQ}d1y^^q*ox07vpCtW6WD2i*~NEv`Oy|=h% zw!l&8&^6dnc&_uvbvvkVf>;SX7okz%E4zsU5 znl)Fd<2a#-(9I=)nbYOOGWA)h^tzPM+v{;PK{NR;-5T_V&5I@sHBLijOcVWXvGq#2 z8k&0nj|By!MJrhrQDiWvtHdxL?y$a1vsOiKhMQOP=6q50OU}DX&5fgAM=LX@rm`Y) z)<0ohtNvZg`CCl=HO9pITdW(!4Qlvk;e8wn+Ubx+eW31@U3cqu!ODo8IBy~xzr%I3 zWWc&LQ=|1?Qt7W#c%Ti6X*;oy$SkX)2?NrCQPP4+&dyl(XT;)DKTW0A0Fj~{Ir6u7 zs^nbp7u=#&7wsKNX|N`{i$ZV>D(Q{^%39mR_>NQMz0A;vFkEG=$)YMlEMwB@8S!v` zni1rlfk428)QkxOND^EChAdnbqy!|1fSN=c3tdvzU0QFb^p{a*WP-D@;n`UiDlj1R zWJ9Ino6|A3ISfQmc{r;InRm15QJ%vONxY@@19e~H)hw~fT*0rRs^;O@II)M~JbEg! z_{KTZAlliEgX!u}yZNKpPKE>o+a1Z&HRxd6Q|Prp(>@iUnn|cMqBSE^^cEtYk?EJc znSvO@Qh*fAgO!X{BRbTs#lERnZdNp45H=iBSOxKfaT(tM>#CBf@8ZtMdcP}vh z#kfgBuB7nKthYPj?oy}xCTIZEt5gz03w|X`b!I1(Y-#=-k!aq5=v>U%4R@;q659Pr z)Ql#aA@hkDaOy~#@Sq5QH|6ab#SkhOo`$rSYRDEcL9V>S&9|2_j~oibYHJu7^%0zn z3>!k1F{KS9WF64kS^N$n8jh4)Xz}R`J|=;mtnAi*QP#bs%o7rCsEb3Jsj(-9GkN-@ z90H;P-KBxWi0WG$!IvT#In6mysrpD7)NLm#ZKid0KF2r3K1M^yFnc=@IHF7U%)w_o zywJKOFB8zP>m-TOjD)VH3xcmHf|(CqZ*yY;+FwGC4G*GEO`RT|sFFLLJTk2ti-Vge zKJEK|{5RTq6TG$K!oKI2F3`q*&zRL&nh=yDnOYJWN2)_rW2V30&n4*tEkJDf7U| z4+@`l_!uPQ+4ikNzAl>a+dH%IX`T=9hV#F6gPtSfJjh-=6{lpny50s}LD^K~Ih>#>ABtxq-2davg8we8kFeng~O`BSGG^GDjhftT6 z#cwK0xOMDp>a+@}pi$AJ)z8bLKCe($XQQQZMK%D#ocZB4i50(yaIcG;O~?Q=yS#I} zf*H8QuJq<2G-7_Qmrr&k5XIYchYSSX#OKJq1q_gmf2@-6#02^@k!gY9&uTt*$<3f-Lz)6j)2mq37 zyE}uTl#FdE8qJEtSUrnZ5~0Olc%x|jJ&#t{CRU8AI*ZqOOrhUCH8Q`?=EGzEFc`OpcSGMg{b(UsvI;@Z43*wGksW(SgkN1{e(RbVRJ%0F-yYz)Ep55 zBl<(gq{q7%{K!&bLp>GI4!=@m;7A?0{oh6tbUKtgB9oR2Z{X}02uYhWqC1V;KaVNO z+&)F863&E1Am|y@&8nYZol*^5LeVYfto%mf(iUNGOvS1JOrp)oI;93i-elV!sw>{E z&Qf!*^5@Cy`AIJfvnkY2Z;c)Ngz~r*a9ZM~aVgx!G~xA;k>}&@Y}hjajq3x88g~V- zovhsrLOAk~^~^@Us1^(USnERgZs7nzxn;#m{n^AXrTuPDid<9F>6XS+v)U_UV;zT$ zOE@dJ>=C^WTEJ$tJXoRFE+#GyS2SDq)|Q8YT@aw4ME^m^i03v)QNj!WmR7G8g4YZ1 zSbJv|3T#xQ;UFmr;jINeds+ogs9?9P^75g`tZd}x7NLc!okXX?Js;rr^X!Q(sZ^K` zs1M0yA4vYl@S%vk%<|ldUZ>fvupX%^hmb0d7Luk}7}8G_%<~134YWF|DtB%bl-LKP z_DwyJZhkr)jNiJ=zQYCZ06W(x3Mld}si9ID8Iq|K6~>#r3K7e%fa0=-&muL&$4vFh ztjp?ikib$4O_I#P1(88PVQm75ej3Il?NqzorB&Hes!Ww>^u8;|D;OXWvb#KkH)aum z7SM?tWP3tEljV|GyNssIdqI)ekmM+x%lw}}Pe)gfs_AnU-6z%F z=hdjUbVZhu8}-cm^BZDl!0OM{-j^7&fKd?I^|BZ*Y!J*xP*&Q^d~Ipqkil4Mw!cbMGk_le5NG(JlUw(%Ntc8 zc&HJUU!AD(Dp@~H`cDn=tuGo=$LE?KDv3`C7KWoESJp!;#ktOYx?dk)A|oS9?hUid z?2UT~(x|XGPX4q5poKYA$#e>=N16~|+FM(jJ-e2MBn8;V{vv9vc+N1)-j@n*!{sCX zs8H@WITWyYMFKH7lqtSr7iDFJK?a|7=g6G|>gQSo^zQhe(4Vw^|>cuCr+0QSMhTk6Gy2>c{Cw0PtRNK%fN z|1);9>0}5jqka?&IoMu}scxb9gX={R8-U7Vc;}H87N1sGS2Raj8E{G{&C1oEo=oH*^|o$BBu`jy57#mf46-lEdYDHL` z)#_^{2JY?A;{o#WAj%{R*CR(oxllT`Lo_7wi{sFa!AYKr3h4ZiEh}2anV~vncRjK* zLG%~%@zdt|M{AsqYSafcZuA(V3SJ@kZn5sg!S-CWzE3tN@cy>_RIiz>E0Lh5Hp|7< zw~R)!Mw;6f*Xm!?29AGSZE$*nIlDn!E+>T7wPf8SsmM43o*W3D7|?sE7n=AWb3?NS zWFhaXztltv=<^zAdX~DsX$T){U~FEf#rAXjXKRCd1_Wp4vCsIw8xZ-9z9Wui+CDPY zYuGyQQxWRRpr21ty)d!$#>(LBof6iVelsg!cZX75H zV)r%FpOE(M&FZ^af)n5fD8GgM7?r%tkhy5r6>yJY75%wI=3OiPF@$2I0G-q#L-4cK zz)4bSE{DiEk!k`+F!}g2sV$I9l6-h=blNSgh|4Rhq^nDAsFIyj{W|(!Q!5h82}Y@l zqJJ-w^QK}oBr3KHz^%~$+^?Ly0OpLrT8%j~)go3McVc%C3o7AN9UCNG#Abqc^~!_A zE3hl=!y*|!7Q|JU>L#er&(RgF!F;wpBSp@_ib|>qht-3k#!N+pDCLNu&a7)=N%<|b zocl>cL8D#K=)?j)Q(XzJj=6oRy;dcx;qMe{;1O-z)FunH4jilOLilrdOutjic`x-U6a9OOpP{DqlbIAlMHKbFY8@yhHN!55rYew%wa8o3R zgH)a@W_GLX@d{3qZL25J3PO7?`MoP;&NWWLp}l8u-b5N|YG}~<*(mTXq{0%~Wp%Mo z-)Li6{1ZiVWKw+A%A`nr-6q>`Cb3N};3g!91D26mx`hkxFmG2z9aqn-Od;AO$8SxUs)BIo~v?zc;z7n`1-~ z!y?LYM_|*%{(J=Fv}OGmn+q!5D&YnAa3tmmAX9_y`cwFft)8{NA3bKG$5ixq4h&g* zurhi)wfN6lJRzs&FZWkmKO*`@)Rs)#5C5X-TchO})|7U%%`h{MEp}m{_|#i``j_I= zRX7g!=IAKCmn=RV&F`+)JRA#YV&uvRhnCF9(rWE!2I;2JgpV#5C2RJQ(V6Gk{Eym5Zd?Q4c&ytX zxrLoef_gnhg7zq}5UP@@9OSq2>tlaxX+=PMnAh)&4n;teyq-_EK~+$Xxp#cKd8ob9 zZPl%=dbOR){H>jA>32rUWj<=hWDN4S*VR9wH*V;t5Jg`X@=Q1W&}1=Ma5c0Ig#L1~ zyFS8P-QnNg-jB%1QgD|^wAf#$e$|=3s?*!o{3!mQ?LP#R*-pp25)$~s=Q{H*b_USx z>vjF^N&VR3tUL8UC-lP5o+jwHIeo!+vK+5StJ?-_ok12Bk8Yt#jnOmX%mqO~D!DP~tk8_CPP~9Fe zS-`2g(C*1D%hcs&>v5%Z*~N*p-Q-lMJRYMBDm_lJ73brqyPn_{OR5?LE{tW!-yRFu z|2-<(syrA)AP!AIH(q*dBryw-#O$r()cSv^Cckl2OTKyUwtQ=Dv^y%>!P}k59v*wk z2K@fTV{wqF%$PMSczH4Y5OGir^6}(l`LHYA*;HCS=*s^#r^j0_qJc(o8^dCK7G=F zIeEbOu0Le1o zxKq~Q16J29rWqG)k0~k1rBpDV#H!_HS#o2)^BcaD`)-tWP%!p2`w{e5C>PV^xAhk? z6+2a&G2q=5OFuW-|GJ;5?rR6OmRg2Q0S*2M+j&UoHggaVIX-Fx%UtD5*EJyXpu=}Y z5j%Fw_VBq-zFg{x#78G<5?8`5s~aOSMS;Lf_ zl2tfV42TZxZ=KuI@Y*Q-@~G5{qY_T;cca|v+T9>^TRT-r&t_4`U-IU5^-MR*_*3zB zyxJu{@Fp*VCr8C!9W_)G?B$B2Bo@Xk5S>!_Tq?NpNkcTs^~xo;vJ}G1BKSIrTE=s< zY)I@~>PZV{_3$)Qq%qdUp7L8p=^IB0HD~O)QLdA|ew6;INo>o^mrb@VXZRB9N1;WR zs}rzp*ReN=uCKu~=b29R_GlcdwEJw?I13z!kwZ#PwTM>VhPqbhNEdseWQLyU6<>~E zb2>)^yff3DQ9iS@_*uO?rH0C_w|mOn^jF=Hc2cI){ zLAUhMr#;DxdO3QznN>vQ#ytBi02(8r=I$Q*j-K+DdhjGwW4kBSzoJu5?k%TmyZTE0 zN&T}YxhKn|xOcu8b@BfA|1<`v<#WGofGu^zvMIH1^ zW2D-|vGc#yH@$+!gf$&E6I4*RZSxeLU~8A}CDnoQy-9jI@ieor$3{!}?&9)3yZE&K zXQ~1d3l(Whq$**&@I109r&-~H#jYR6yEFJV#^R6j+AY4l%^BAy>$*Oaq1U?XS3z0$ zY-4cy=j=PW!h5?sV&x=krv2Y`nV)r=T}_hldAQ3w)}YA2dy=SgnYTvR{0@HAG5U+7flc7jtqeW`us(%9Oi@pVh}1)Z_qb(yETOrRc=>%G~h*8JbD zcUp^jBD&u5eb_qgUl)M$LmHpyAE_;GvLoLyos9`Oos7#Bc&ZOFdAa3E=9y= ztFJa-5&=S}@vCj>SE)*9xxHB6gR3M<4(aH&G5JQRj;-HqSAD$Gug01&_E<72$5o8Y zk1=DDW5`=4OntH^hVIaD1kx^(iSY9gWLHCRxNjekT!YMnV0j{P3y!SY5n%=c{&oG4 zeQq0^a$t*tGHTdr^DFR7FzfiStGms0-6kCLy{sS}i=ffa_Mznn!sG$Ya_E-#i|=8i z^sYZzt3UKJHsAKwYxT!I8S#4tOsAogS?M&Mp%bL|dZ(GN@a6i3qv6UoLsm z0QD3%L@zfEY`p^TTp~6g$+=o0OE5YBc!0YHWOpvpoPoV|tIP2z#0|)3=P)??dYt+8 zF6bhXMLW@L!8&cFT3=gij%X;sG}H?y0mUzQ8AGcgeyz|nM0&_isZAJf6zdJ&2^av1 z2UB%~6d($h16}Ycyhsy?N16yDAtQQI zQT_vT%sT`8Zt(G#ii1Xy1(PEQ6np3u?2dQSB3!yPQnPOlHi{*PDW91^;{pL;1$FgM z@eJqidD&pFMq9U!&3!VUJ|D3EGRAy8CJGUQt`-2V(8)rEZA> ziVpN>r6h)^3i}23Cn`?r1r>iusdM`N^X_=_j(#BqfVY{TL2-hAo*mOC#|*R~gtFF%f~=)1yC55f`_lwpeC1!mtfL= zwW^5Lk-+lE{6cB)JU2y+DxD~#Yq*&DG4u8C>UL{*7whbCFzyg{!EM1nvTZ?Ui2fnI zfn}E{fbqlicB_L1$0Thsqpi!vRXfgGeXVb!qE*-S zK&g`w0=RlmvZEvWw@HROSh?shw#$Z*Uu(ARDPEo5xU)swA-{3A{D#~|aT{DB+u+d1 zEm;kb1Fs3fAz2;|N6X`U`#6T~dpLKxM}}{+Z9P3sQn$lDjWVB)QlE`-zZjJOp?x9j+TI&%LGN@8Trw|Iguj7uATLOby*LoHA*x0b(-RTr_I^djz1 zSZdIxKu9K+o$aucrjv0xe3d#*o5jmVXoNH}{ zMUDJ+pOU$ zrCoBt;tzj1&f~G@4M`cVq3<;}F!m z<~%;3A0>WpvP0y~c?060EAa=YL!~coQu`#W6DCwio?X_)y)>3JFMzb5ZXr>JNYHxI zV?!gmdx`b_gxm!a)cOhDT@zyW5Wz?3a@6(P%N}^^1UNMXe=!=J7s!551hXFOhN8mD z1$%B$-T2X)mT!r=A5j#7rPkjjpc9Dy?YHBK@$}~>G>}v+unLGpiHZ|oan&=?m0p?< z)M8omI)_Jov6MLLo0x`dd*+B}AH<|`Ho^%`%-DD zbDRZKB+l!d!aAu_UhJwf>7;#~`vjax1!Q#`J@Hqj*bdG5PU$DQvpCsbizfTd`bsI| z`PdHQK$u4#GpFb5!>n4>ul8gp@=$6Kg zmc};H%9zZAqawEjcHWi%R%B8nhX$Yxs0Y?UgnM+!x&J`Q-uG8zRUPh@Dve@T{T|J9YLL14t& zYIp$|IH^d-TSntob`#hi7u^&7N+Y`8!!}Pp*rSXqbF; z)ZQhLJy^EaK3Qw^6kMOqv|LcZPP+@aB^kC*>*OhQ;_BC>@RlF}#h+HE`+?<1oZwEg zR^kLx)(X;N$7t(tm6(%n>)Z|{8wBrhly$`v97?z@$ZcO>o|@pSnV?Rc;GQud{@sq| zgo&~&2tp$?(r*m7?+;MVI2X(2GqIfLugvS{Q&|S3x*4Qb`lQKDNLhG7CETvI|28O| zf6qxdr8rC>Y;edvVN(hPEArihDBk?-1OQB4rUD=@r7}mP!PybsW_OY{noO6!BPr#_ z>bI00pU9`jrZ{VBbJz)YVjcfn`#X3W6nqUw!LN5oYRra|x+L|m6FtQ@z?Lw4kg3QE>y&BbI)isTmI$(O29_P`qbmE4Ro+Jgu%NE=&K)G2 z4MPWjr#ggh3W4|~AF;1}RVDsO^)v!M>2m2n6l9s@&~c|9Peg|JP|#<;K=cGc&S9hA#m^zY*aF=b}$Mt#ETK zi|S}u2eTOpM#ZzoyOkz^XWYkNGByG*DX#^dr4t5=I#Zgfv{hAEu7<~g7*WakF(P9& z3qT{zaTp51a9wdv>lE}|uwx^=wTd1*z}h?w3d#ocYq_=Xp=qW*c}10dd6mAR%HR43 zlzUoO72G>bUBN1*cdo?PrGHMEY}QQfb4#-6`VcI*T33~fy7l8hw>06Xjm55f5ZNMS z(&dZyRe6$=*~a?qU_0K~Iow_-D~(MOAPamrl#C=^7o!jtgfA+cOC^c*9hjrOZfUN( z629}w3dse7vp#N}JH47c5?*W3+zTS;fs)<|LlUBO|B)$CoEmO%YJ@{a7ki<`x^p@i z4KnUzJ$Rc6_HPQ@p#B%+@sE$CLMh7^k5Y2FK*O#M{@OM#fa~ZRl@tdjJjZW;kMs0#w6Yr zUqgKnHwad$Sd}xFvoAvQdZPuq8pL2Y{@g)cKLt@)M6N7o+VHG{SuZvIoH_;k? zMIu`dJJ#x*2|gu}SDEs8;aq!Bxzn5+Q&s&x`4d&l@BYbjf6esDlavn)q+=-NvIfU} zU%6jGzJpZRLXc&gR8XQ@(LmBBF?%X-d$^JlsK*JL`sr9%Zn%TrYv%a7`qVwmsrdIN zZV?+_5kQD|eLYw@K2gBq>mh3>cLsqsa?&d#EW^hpIzl_EU>EDd8OW(L?zFhA8r>FA zKZgZDD|*?=xrd=eEV9DT{BBv((Sv1X^*o``4Vt5jpG8TRTw$spK9$VAo=m@*3|<5D3!?fT$!vy< zGvwVpN;lcO{3RY})y0w2<5d>+Y}UIbB^`BeRSr zieSd60Kt`a2XtR9gNBQG(Iye#Afikkaa%;2z$Xegd#m0RU-VOw1}@2VssZ_c5-cgT z=+j9Yi(CG4W22A{Q0BupEjR#EaX1nxs7CS9K|QUmhi(_;6p|8{E4FMqO2hDaavS6 zIx{(3k%A8}H2AOhN zE}R`6YQP!or_Y%kUpG6myOT>CBK2m(&=G~OMz>u#J8{))|MJygeeLk0oA|G z<}S~j(*z2WZQ!KYazAI!DQ^hseO=FDfVr&3hT6=3KO}+R6RcyP=I7_UD|7J1*C0t8 z^`VqBVaIhpiK(B?bk@vN*Uxlrnu%j?4cALU)@@HT8M^M zn{w`Na`u{>*)IKO${fgF<}3VyaU2%$RHESZl51NVD#}}r%Er+*i*y2K5b(CFRgsh9 zXOd}mn7&aFQ{ol08eOK|pY2ryH&Lr8plnEUe4R?(tKvrpkM|&3ctCoIq7;R&ogExa zoeS+K>QYKF-px@_`E+Hfid@6$Ty+WX5v>*xpbE?O$CDKn4y7=(m_n7}Ja2I7DJs|K z>d{T6@%spya#hvhHltNErM;GF(s{6d#>4D-%G?Uagvp|UE6OhgL((0^P!Ma(_pJzH>&IF}dip)b3Jx-TXIfMo!3B5`&luI%2 zCa_8+1C8&Cm3n;Srn*6qqd44)s9Fcp%3N`?mtH%|+%ik)TpTqR70ke25rx|`)VdMg zPptl;Shz9TB=>M8ktS9!!-6*HrQ7)>nl-%^bnO;X4gV{1XQ;wDVP5$ibJg8*y%*-1 zm*!HN4UJwsI!8WzdTx-wM_orJi93LoTZ}Uys1F51i@x6ysr$#P=;?&wQ&aTM+TuT( zc|x9iIZ za$NP>xpMNe^Rjou%(nz_PQ>V+g^Vip;ysaY-50dSd;;jo=gnwi^G5L z7_(|5b~7S7N8)-R=!2$Wk4K5t;gBnN-N(dM^?)@vRkZ`GYp?2vwYPP6?Yd(Gw9~R> zw+x34u)djJe&c*~%Y5&N`R3{Q5zzG4QHMV^pS-G*0ko($7Ra5vG@r2fw<`DvT!_dc z@~9fMX;7Cg$X~HQetcB7^Pw__n?EivSMh}f$g|59wDrrIt3>Ps<9X>rU5aOdQT_RR z8K_GZz^~^z*m7LwX8F$33)pl%m=}L-o=0-6K8!B~A1LSL=$>AmKl1N$^EvgS1@31H zvR^LZ-?QdB2^ddHe~P|7aiT!G&Dp&4rRN<^40{w!T|xPMil0=Q-(+ z@TK|QiMkt&Rg93}Qt?g|XW8o!uTY)d0RMx&I+|KrmX`o&Szc`2iTJ*htQbTKDrSHk z97P2OBS=a}In|~}qs=yOK1v$AQZ2FOo;JU=Z?rvXQ8b!W?XixwXoL%0oYh^~$1c;K z1fdd+JAjF`@;rf0AFmH%nu6$x664<-nMOwzC(TMy>{4(c*+-e_O z%r8rB{wYc?fzfppMLXxI>G&kJrs%%`+$(aehivI>W`}4GS(yzp_+hcs@pugHldxXe zH78{_6_s*4?5k9YtA{1{Mdm?SD}Ir>{m7buUXBCP3Fg5Q7fTm_hCvWfa3+ee;d%iw z63Q~(!|9OhNF?Rsz#36Y4_uyIp-FJS$9KWjKQ-7Qhd^E#*c_{nJkbZ6` z_x#WUsAgqob}$()(R&Evz;4JNSk&PU%GvycP;*`pe5Tds`YiLACdAQ+97wRZN7nkc z5Opr@JZG^vcX8t9i(}_6meP;vU%N7E*Ds#>S&~HDH6$hxn14uR{HjKB78_{~(Eobf zM2Lag+5`$1&xPRs3sAJy>Z)ebVkYZds2Amh+`C`*u?@O7QVIA*Od1oC4h2Tsgdt{N z`aBrjN7R8kA{T8ZkjR++sjKg^DZ1i3s`Rzm)XQ0&j1q_-w0h>KnF=f1m6BgQ_@=0) zk{#DDiMd)eGFPYJ2b?T+x?2RzheMIVm>!yGy}Mi0dAq3#ck}Mp&D_0Po|3Ta;TWsT zqRYTp|0n3+1>d=bDdIyVao2A0gZD31_brxL`p9nV1((aq^mV&|0R+nwQ>8*+)TEcg zR2iowvWiQ9##G9b19TX%LiD<_84=J&k4hSao$g|%)2s*;pDvxre2Oa6B)duYTVSo* zJ;(IPIk<;KObEVX2MKI7Kn+2pElBqYilm+$wAs38cVOUX-V43g7K%WQB}Tpzf|%ty zUF=c3Q_r1A7;NQDigms_hkF=i+2s=X2dRF|9-wUeB*lk8fiuFm7Ff#o{9K<3A?ier z@}OsVdL1?pr4XN4YS!;+Mze7>hHa3v<4-eijHz#hwu;Urk>WcyXm%4@N#pTJu`C}_ zV0^^!&HJmkAt5+|W)r!wo!enLWOO6LLq<0#nBMUsdE!G65;qvy-rBT;6nxfX_|qk@ zgk7~H1*Iz`iLn(k^VHAx;N)Qa5~#tDAMWJ06=TPGyA&(fSW! zIYt9i4tAIijg2A@fVXrGm3u z>^-@dRISq#m0MS>uKFz9Weq;TYLC1Tr+cxOwbj-M@4c@)W-rF?ibK=cO8SnN0>Sq%&nDmF5q-dz*Ksdi^M; zi;4W+?&ibY%?G=iPj^?hEk#N_zf^r-Z-Wt%I8cNUBI5SGt?t`XmguIXr6oagHqo`k z-*H#uDO{&X9@>F472baY_7+N{Nv5WNZdirnsffXCs~%MqFJ>w1BeUXf3R=?P4*GKG zh}uMZCKg}zS?l&Hr#JD2InL>O_-9h0M{m}#_b{{7olI+V7&$JoVHJE$I}d2x37K$} z`m40%+`ZKGPWWGBm3nZ%q0pD=rb745xA9r zYKoYJaP<LppvN;@y<@ps) zD(m&V+mTmNN?H6(vACUdalex}Tv_(X5_936&INn&Xm;}-T$2BGiJy(laCbpMC85b* zn%&La-Be)wxOnX$X$(Q{B=+jrqQZR<3AZ0}`S(~Vtb8eGD4SPaabecx@ruP6a)@U+ zJ9o4-%!!ZhL!6r;C=NA?h3^lXwoW7{&zH@T=?sGCe^`s7#i!^@f5uVIIyb85>2G%Q z^fph(t4kC*eDWA)RZY$>>E;;E|BY<>&+3KVqOyhGU$n=tVWHa42b zH`3$tk1yXvCtj7$852kD%9GEk8lrK73K}aGN|#_9qHGEe^vh^4d`~IAXfluEzUWuMte|v)F;L zvf%r%J&55Q6h9;^gNjPTbNU2Dt@MDywbJJ+Ycux_Yy4l7^Nn&|RmohOa`1uk4Avue zO}HBY&+vg1agwRBc!-=1p(d8uAaGeIG%@i-FN(8f!`K|T#C_Xb;sq-E&~IGgYVF*l zozpd!_(mlH=O;ROBBRFq;O9yENJ25f|DjxrvII^p)gR|3x!j{%?y3K}Tn1A3pU5m+ ztvBlLgh}=`CwkhbqNi7RI?zg=6t~`X+9Vc=y6gWh$3gzyJ|r^NYwup||5}@Sb>axW z(Qixpe!>5R&HwsF?Q^d;(tebMjQy<6?Y;Gk*_x=>xdPVsRl(aN?%JD!3Lh$aEM7sq@7)nIKu%nc@X?rYu)Z{x{=>6oE5RJCb); zg21IN9?aghg8$#4|6Z_5sIGXtlROcDgDK$$^>L(Mxt$^`=6iXb2v`L4sz zJ)^S!RQ7lHPl$q_DRS&K2FY2k?VGjDGB-i;XWBkZmtoxNgY2`V^CNSlVL$&X+kf63 z>5unppPECl1B)V|M!m?U8xctE42$WI`bq-^u%{!$)9&fo^yv9uUpe_mwj%65wPVx= zz6~XWveghR6=q~^R@`3XBzWsSe;qN1@<_;fogSe#$Dss0wZsX`DHD}RF0lkwBlsZuPcCTOub;dLzc=jzgekdXP; zxz(q+rDwS2bhqgY*FN0^No$Ay#wx6ij}-Q>j^%dg8mHO_kzW&0E|Tq& z%TCa^QbNqLmAzc@7>*+efuiA{mxbLC<5`dE1I5ze1o_Y2VYXbVloYZ>5dR{&T}dY! z9sRnazE4MZ$~G(c?Vjsp`vBEKgTAz_#}$!j{^}(6RF}f?N>UCW!*)01RUUaIsgltj zguFb%c)1Nb$jg!1@rVXTLUW|Qt}=oExk`h#UHOGGzjnc^+FGZ}Lki3x?EIrL&!c-| zG{Y`Ps$`k}$GR(?_37 zpV+GMByvTBN{HLbWKx+JH(EU66h1YjTmFw{&l11hpB$X?8b4oNUr4%$7@3p!-&fDu zSRUN4NRe+?E=ZBjkQ!m_;NoXLboJeGXHN=vdKqBC1a-q5(?rz z*#uToYuW7TZyyVSJ-lieQCYKSR|is7ok3`_p9hj3gYP=OmqVNt{8H_9%h8OX7_PAp_&Doi0HwD|&MN z!NxDH>ZNK7s7u}+WY@v4m!A$sS$`vCB;k}>@W|?5aDR$A9i4+LAGO}y*P51l+ohI@ zdJUm&UUkz>UsKReI?5s}e6)Q$3v70AwJ-NSc%sx^Ke}fmFH06QKmT zUX^vs582RBED?=t6WB7yrDiaFMai^L?fig(ALdCXdV(gV*E;4W_FOY>UaSxt7@?Nu zk-+eX3=L&~)JM#4shw&cuk90b^3RF{(FS}2Pb&XWypP@{ zPTa2q4t}qqaIoDgTt0%H%-^}?-Crwbv^hl;u2-e6DzjNt--08+zFE1+G95l<7aq3b z>y@EWu}3upDy#kibhPay)}u_s+{)XSuuM`0?jzKeDp^UMy-rplgbY%&B=--MHN9Jg z?axeem>Bd5C_+$)J4`t_iM8IMU_kF2=d3P7x|AbqNBap0G*BpAb_6v=NP+4 z8CeL_!Zo9ULM%@I2N3aQ-4@m`9;no0>b%+%eZ>sKk@X;sEFeBbD*oc5IR0C$W1w0# z^X3-&dUo+?dMpf%wx}?Ok`p^3Bc&d`S4hN?=0NiUQy#lo6UECdP0tlHZPEe2F3rCR zY=fxlbgh#b?+xmS-d+^pm5(j~s~Ri|MkRH5gZkS*_~!xLX-~u&bM1ZY{UE2B9C;T6 zA3@-S#7R>!0fV-Ys3ZryXQEQ?%szje&7);^-0(OOm`AsF4euXMuPPdZ8|gXwFil+-wel53CB9=I z+&htS0Fw4?H`&cZ9C6puk_;AxF%5Cp-13gu#q4D2?4;?95q2}+pj_HhO^eE@+F)=h zQXtW(p{GP%1L@Rn`+JW$VS7lz)|dec5c7LxvBJWx-`6INtye2Ll2Y zSwNwAGBRi2kIF}i{@D}e;Udmtdg6SdvW28Co6oCUCf}dSLt+ya`wIE8Dn;eKQodSM zh1FxL^0lfatQ}vIuUB`Y-}FL48kw5NSd`Bv4Ef!`tDrbcDj`bOo)s_smC z&**%w>dAEUjLG){BktSf(-Y)n?e}HUbv%Kx@;%ps^Obd}r&iX5n!d*LdqaP#tizVRc3DTG`?}KaonyzR z>v7}z({ZbXN<6}Hlh#Ukh+SA zz;9@1cd?fz<6_CBgvKYPrfWcnpR4p0N_FTZNS+LP$BSu5kAgQ;w6YT7UJW0ZnY~f& za*u%5sI?F0PZ`d?)%AyahYdJ`(9)7cWHJ&7xE?sECBKHqwD5~pAUQ(9y7-@JQH!&> z)o-Fw$j{6CCM`f%u=3d5sVv{e{k^?y_y;*d%;!OK(`|wG{h-)n-RKP)3}6rL_Gcic zy=wFC+8r(81MB}4g9we|Q*B}$;%WxLG8(mgBU0@?oO?RP$&M$`--U)i|s7i`z22&i#bZXS@bWU)-SD)-!cRJvgh{nT^Lv zfX{xwCIM$zXSF5&xOJ33&0a=Aeo3j9)#!BDnl3NV=_+LDtbP*hUFyjvGugf1a)d;$ zgxeM^J4lK=6e1G!{%bF+RLt#oo}#X1^5WK^8j{tKxsYQKIa~J$7ZZ0!PG5?2>S{hau@CD}+L#GqNPnBfKKJmkhb=oQK6(p;-vz-y^Y;pxP)I}5wFbI9}(j1IBUTr znod65b`zORRGXP^Pc$9S!C$JqYn7fHPxGq0%N2whqsgb1C82J#k7-2T=R*G}(eSje zN{0h38t~*nxD#^&BPBDk&H2^CzgEqv&D6MvAIrc(Y*uYx2u5dsL@>YUaP-@1Y^FQF zut8mRhhyFDmHoEQj^94UP3jt`B`!LelAASrJsJ6C&)C)5<>=i@yJZK0DfvB;xuy;`7EL1-6%rIA#7YJ8xJcI;5dz#gvQy4j2)Bk znDzV9qa(wmnf`cgvOK#WKO=VxrU_Sf#VvkY(fWV%ihuF^KYPWkp8tkd_YPxv zG%lUBZ^A)T)SFlyh@nNW5JEjL4%0r#gXwN{5WQnA`I@3T?UP~#nw-^V$iPFQ%)2s# zIVcz;ynL-Y4rN{EYg@0)WUj-}8_)F@)J4TScRDN*Uv;In-cPL~i!tXG?VdPs9q1r3 zifdskJs6Jo)n9V1OltL1_`*|++(PQ%=IuM~*}esI@D{b4xnb`$btf!wp5=#9)bib= z?q>2wiOnYQM88XCBSOENz3np1)VViyEM!XLr46a+bq|r3=BGlFEYbk87TFpji;2TO zIIGtp^!pELXDElq6loFgzSq$eMq!XYEoaZqF(d5*;`ngMZVCC#k=AcqRrGQbfX9p> zgNY(4jdn_G2I^Td7Ia=`I>X$9%mn)SbNXi#aV;GNTnnX}Gnbm4I-941EaaJd9@BAA zcL*_)OiOFT7_p4Q79TXDTjd`kc4(sH4|M!Hto+Au8V#jj0^Jj9^~LF;a~U z65wN+$7$6M^-7x6Bih+Wo=(AXjMAfm@Jf~YmaCHfyx%|{X3 z-#VI+?8P-VO3o_Qli=SFL2(+!7OcMZ&~wuFe4%n)EnwU|SJ^MAlO&uIO!=2}Rav)} z(`p%{3RlyH`2uQ}CmpMHm(vfBR?>|C(d(=wc_pTk`!enWnRcn1IhJ}6>jdIda_BPb z;xV5+`E2H8iArKnZnf+i}|9V&8{%mc#g!v(@tTNN!(c+ss%lMYw+|&Ak|= zs~;ia&2~;1R6AEsk7f)I2o}$nw3FUByOX=Knx2>*_6IX2Zr`7<@3>DLEBg-Ixq;*Q zIWC&fE9Xzoh(2e`HEQQysWjb?ZYts&Nbu8o#T?$JxMt_#IR@*;y>9d~ci?=Z@6hp2 z+)2EP(@b`)asQ#!Wo~l0F08>v_7w&Y&%eBKeDE`O;s&E{OppJ%(H9UbBgd`>(1mH< z^H&+-P_rxDll(71aDOo3E`6u)!yR|K&1iHb?sl`$*AJilE=E{ycND9<*KNj{{oE7W zI&+EgD68FUh&#O3<;MM6jE1Z0CvNZEM*k2D3^&gF9xoRh1t#n@t=VoIbVawj*oviy zY~pSUO@e;~FZ-4;Z=0Y@tjj~neF8O5nnfKvZ*`ruFPSp7;(F7_r=CyCt;Qt5fe}7a zy*qN>5raXXDIr^llovmbI`_SYTQ*ub&<4TQy+-Ui*6^)jQ* zQSD~*HL7u}KS0{>=?W~3KGmI|7ulUhrh2%BL9UdIM80IiUKs~ zgB>TPp;y6^FBD5+Yg4PPQY%YN^VN#H)%%h-(6A=k%(>VY$1s~Bb>eV=Rvtf64silo z>h;>(m?8`?BV&w@Eo>rxGWPGrTn@P?W4m?pHEvtBj3dXmP^se2f_xoj_R75X&$QDW zrmxkq?`m=wseS3xzzAG!%;0mQc;#j+ALTUHmcx=N?@=P6p|or2$}v^nQstyH%6Zn* zzU&GA=?moNQB9AjuIIhX3!eM5m$6x>uw1ucEKS&bM!QdI^NbXW!9Ca7E@6^n)W~!L z*?!JTUh+nz6VEAV)>9PQgw``+LWoX$38o^oD^_clvSCsu&6!l&Z=~81%#_Uwq7Y}% z1uCJ^cEMPJ9XUMIxz5%W;X)xO#um$G*{~7cTXMZIHyQ$~kWdW-Wm!@ysDH`O5uHi% z0YX(u3fnd5zonwV0(y=QRGi%la8VO=Los#%VI()999t{pXmXm5Lz2Zv%#%o$n(E#Nf7Y};JV1-3C(7K52|a86yqjbYZRj<@wd~pRw%(% z+Rv(86g!U-dq1WVL+zS346N-JU)grIg)!)VO=naR6}$b-r+ z{@!$XF~YvAzERQmpRKI!LD?@l&0koN9C1imnj|dIYVdNGO6m7ZIDxkQmEn@+!8C+a z-vz3HG7s=M*4gCNg2e(Nk%Uclnm^U<>`u;o+vvxzgD2=JBx5v%CmGfP<6SM0_MUp$ zg^c$dxAasod9vs|Rdk;$!ZQOcmwL@o!{BE#+&I z8Ym>H8tP5m0Ez#OrHTjj>v(8!)Q0KuS@SR2W%Fm!4!V130vTE_#eC(Kyy5z8AFk&z zN6ac`O9zb9b-IqiJ?YL7HGQadR?XQDe~!aouUN|TYE-SK+_$*|gc z*OHK{v`Br=E8pQEVE&7f7&f-}?k`a^)pyA4mfYiy)*K+!eJ9TN?0>ieVb?facvWXF zKyd})HObvsGA2;nzlS{8Jre}Jddrm_aHsF?L=f_x?jF=0sB8BJo_nho-Qt;B@!6At zA8xR#$yYxz<1K<1JhzMcKhO3zTl!9ozvQJ>j9ltB24d{o9>K|G~cF0qCt zaXU`1Os-rE3$vIZ4giGjiUnLpb$d3t4G}eeG&R3PtxRQwCy^CqInBplznuaSt*_to z9kRkb0;tcGq2!Ga6nsFE>wLz)A+R^%U)Iy2sqkD807*+GF=uG6!@cjeLqFe(g`>o8 zHoRAvpQ(C`qzDG}#cnfE+vcB#?yX_0Pu9ihvnmhUtX@uKw1?1>2}*0QvwVIz1|ew* zV|O0|(;>7^$|BKsFIQ|o<Dy6%HO> zkJ~kxTGyy>jgqksMd2L`I;eAhQ^8tZfFzL&msFLiu2WUBC#OTYz$JlRKNyKqFH~l8 zr0qdjbkmSqno)z&83R? zVaEL*!ITqUB01cmGqpKggTUpDR?HEnr(U4rN%-33?jGEy{8`cLFc)2@q-kt}@=1+i zsJv5wrlEVgoqXx#)g!Q)E^4cvPFV4oYFs?@E2o*y3$cBR87h7oFs1qs7$4j35%y8p zdS9#4u&A)_1162i)<22Wt89Hlk|Pr`JrmYBXqf4_o+HHcBGD*<*Oes0iRy7Q*2gO8 z&B{ER()6#@E4!WMqZtJ5mXww}1Eb&+=ML1_tU}4ai$j!Rolvv8)!q#m_o>*u)VR+X zs59$OR}U-F@whbw(|R3VYjHB7jzn%kloy&}dZzVIG#<;)-hLA6hvV#Lk&2I|n;hZo zrkj2FLe=xWDx>mKticOUiCW8T-*qaH2j_nvb_wwtz!DJIO5jxh9s zW1|CF2n|UZ^6iE1tK97hqO<1#%~LWP)Z-V`Uw6xqdRnU|F#)1re4{)+Qnt^ zO(KF|=;iBmd=)laai`XJ1HzeHd#B?OkA0!FsYRGPZnwIa*>gfTQDGKgxO-7Y! zgBo{w$t~QXqpLN3ko`zSS9MfcI9vMAm_aKUjoPFL?iB`Uy!J_xd&U&NgwO%;W4O>| z5s|&KZoSsTn@oY!S!k%0%3g;<-*Ilz1XbuCX-%l&`P%Obmil-oR{OPzxHskBr6TC2 z+L`^#(y%!{Ur)zw&kkkt=6x+4u7s4D65`ZT3 zj}-!i8_mci1SReCy8cJSU%U&B{e*Qm{Fw{vrMY9Vx9D4n_e|vGR%`^xIo2B@Vq$#L z=&m5s5@dT2LB0lZ!wmclkl2o#tlzz{IKT^&s#d?b{@uPyw zmDiA5sP6J2%zk$jiD7M2zb+;0hKo*bmjmMGxV2mQaW2w5M8~|ybxSv)JD^h zF2CkoWjdYaA=MxB?be^|BX#8D%%lR8$^CuJD}qVEWIHMBo6(?) z>yrX)CIeUq61v6$>C&ZNn_!&{I`tYCyuW*bS(Pj&!)J?^cmHg%gVy~Q0AKs7T;?%c z4AJAc;Hg~yMoa1;i%|YhDR>|k{32(c1=BgrYt#GN`&;Aheh;@Ht3-?&}XUvVYi_7kYvO6o78|>kp z=kB->DngZt!NG)&njE*ex#TPTv<+UxTbeYRruH|if4&RI<1K5?cg-2@$i@A~bM8~+ z?7wW!pc_0{X1n+gtA3rcFXZgYbQ5sMo6Gi|a&2+)FIDG->Sv4<#GvTvDfh9JyHet0 z0m)Qm*XvVbKlxeUocf&mo(c~0-&0Yu?v3&PwdfUk5p89RKH9dqN3xBnU#}=|_7F`) z?Zy~I8%Ivgm;&={ziK8sE|3hQA^ezX2I&KW7$O=o3s!F6SW(0>AlkeD3x2Q3ptaQ} z9FHo*v}R^NdlFQIP_oVfO3xLga32vtgrcpeZ!(<7~hd zR{$niBMGu+V$Bv7-IqxV@{+hEv+1&sE^k9qnTWmM9M_rL8no7i;CBd(`8xIjKq=o$ zV+-9ed7^0JUJ^0*SrP*!k~$r|+*8QEm>C7=p2Kw#aZ&?Q6nX-@6~x#XoG_T8N|wem zCK_)H-V^qEU5MLbKs^TxtsN#y3mfNViX+IwYV|5QzvFCHX)e8kgPr{W?>Gq;IUQ

n8zsd9_(zFd*BXw92}e;Qg!Rq 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 fD>Ci@D!Xn=kF`5RikTc4c&>J&YBjP8(T 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%0A5{~N?VF`>NiIuP{y^AN|0l?#nZ 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

B19B{zXxCFI(?}hwcNvIBLlIaImQ!K+ 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%0AoY#5e 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�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 D{EpNB diff --git a/internal/backport/go/doc/headscan.go b/internal/backport/go/doc/headscan.go deleted file mode 100644 index 7529525a02..0000000000 --- a/internal/backport/go/doc/headscan.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build ignore -// +build ignore - -/* -The headscan command extracts comment headings from package files; -it is used to detect false positives which may require an adjustment -to the comment formatting heuristics in comment.go. - -Usage: headscan [-root root_directory] - -By default, the $GOROOT/src directory is scanned. -*/ -package main - -import ( - "bytes" - "flag" - "fmt" - "io/fs" - "os" - "path/filepath" - "regexp" - "runtime" - "strings" - - "golang.org/x/website/internal/backport/go/doc" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -var ( - root = flag.String("root", filepath.Join(runtime.GOROOT(), "src"), "root of filesystem tree to scan") - verbose = flag.Bool("v", false, "verbose mode") -) - -// ToHTML in comment.go assigns a (possibly blank) ID to each heading -var html_h = regexp.MustCompile(`

`) - -const html_endh = "

\n" - -func isGoFile(fi fs.FileInfo) bool { - return strings.HasSuffix(fi.Name(), ".go") && - !strings.HasSuffix(fi.Name(), "_test.go") -} - -func appendHeadings(list []string, comment string) []string { - var buf bytes.Buffer - doc.ToHTML(&buf, comment, nil) - for s := buf.String(); s != ""; { - loc := html_h.FindStringIndex(s) - if len(loc) == 0 { - break - } - var inner string - inner, s, _ = strings.Cut(s[loc[1]:], html_endh) - list = append(list, inner) - } - return list -} - -func main() { - flag.Parse() - fset := token.NewFileSet() - nheadings := 0 - err := filepath.WalkDir(*root, func(path string, info fs.DirEntry, err error) error { - if !info.IsDir() { - return nil - } - pkgs, err := parser.ParseDir(fset, path, isGoFile, parser.ParseComments) - if err != nil { - if *verbose { - fmt.Fprintln(os.Stderr, err) - } - return nil - } - for _, pkg := range pkgs { - d := doc.New(pkg, path, doc.Mode(0)) - list := appendHeadings(nil, d.Doc) - for _, d := range d.Consts { - list = appendHeadings(list, d.Doc) - } - for _, d := range d.Types { - list = appendHeadings(list, d.Doc) - } - for _, d := range d.Vars { - list = appendHeadings(list, d.Doc) - } - for _, d := range d.Funcs { - list = appendHeadings(list, d.Doc) - } - if len(list) > 0 { - // directories may contain multiple packages; - // print path and package name - fmt.Printf("%s (package %s)\n", path, pkg.Name) - for _, h := range list { - fmt.Printf("\t%s\n", h) - } - nheadings += len(list) - } - } - return nil - }) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - fmt.Println(nheadings, "headings found") -} diff --git a/internal/backport/go/doc/reader.go b/internal/backport/go/doc/reader.go deleted file mode 100644 index 2c9ba03762..0000000000 --- a/internal/backport/go/doc/reader.go +++ /dev/null @@ -1,1030 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import ( - "fmt" - "path" - "regexp" - "sort" - "strconv" - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" -) - -// ---------------------------------------------------------------------------- -// function/method sets -// -// Internally, we treat functions like methods and collect them in method sets. - -// A methodSet describes a set of methods. Entries where Decl == nil are conflict -// entries (more than one method with the same name at the same embedding level). -type methodSet map[string]*Func - -// recvString returns a string representation of recv of the form "T", "*T", -// "T[A, ...]", "*T[A, ...]" or "BADRECV" (if not a proper receiver type). -func recvString(recv ast.Expr) string { - switch t := recv.(type) { - case *ast.Ident: - return t.Name - case *ast.StarExpr: - return "*" + recvString(t.X) - case *ast.IndexExpr: - // Generic type with one parameter. - return fmt.Sprintf("%s[%s]", recvString(t.X), recvParam(t.Index)) - case *ast.IndexListExpr: - // Generic type with multiple parameters. - if len(t.Indices) > 0 { - var b strings.Builder - b.WriteString(recvString(t.X)) - b.WriteByte('[') - b.WriteString(recvParam(t.Indices[0])) - for _, e := range t.Indices[1:] { - b.WriteString(", ") - b.WriteString(recvParam(e)) - } - b.WriteByte(']') - return b.String() - } - } - return "BADRECV" -} - -func recvParam(p ast.Expr) string { - if id, ok := p.(*ast.Ident); ok { - return id.Name - } - return "BADPARAM" -} - -// set creates the corresponding Func for f and adds it to mset. -// If there are multiple f's with the same name, set keeps the first -// one with documentation; conflicts are ignored. The boolean -// specifies whether to leave the AST untouched. -func (mset methodSet) set(f *ast.FuncDecl, preserveAST bool) { - name := f.Name.Name - if g := mset[name]; g != nil && g.Doc != "" { - // A function with the same name has already been registered; - // since it has documentation, assume f is simply another - // implementation and ignore it. This does not happen if the - // caller is using go/build.ScanDir to determine the list of - // files implementing a package. - return - } - // function doesn't exist or has no documentation; use f - recv := "" - if f.Recv != nil { - var typ ast.Expr - // be careful in case of incorrect ASTs - if list := f.Recv.List; len(list) == 1 { - typ = list[0].Type - } - recv = recvString(typ) - } - mset[name] = &Func{ - Doc: f.Doc.Text(), - Name: name, - Decl: f, - Recv: recv, - Orig: recv, - } - if !preserveAST { - f.Doc = nil // doc consumed - remove from AST - } -} - -// add adds method m to the method set; m is ignored if the method set -// already contains a method with the same name at the same or a higher -// level than m. -func (mset methodSet) add(m *Func) { - old := mset[m.Name] - if old == nil || m.Level < old.Level { - mset[m.Name] = m - return - } - if m.Level == old.Level { - // conflict - mark it using a method with nil Decl - mset[m.Name] = &Func{ - Name: m.Name, - Level: m.Level, - } - } -} - -// ---------------------------------------------------------------------------- -// Named types - -// baseTypeName returns the name of the base type of x (or "") -// and whether the type is imported or not. -func baseTypeName(x ast.Expr) (name string, imported bool) { - switch t := x.(type) { - case *ast.Ident: - return t.Name, false - case *ast.IndexExpr: - return baseTypeName(t.X) - case *ast.IndexListExpr: - return baseTypeName(t.X) - case *ast.SelectorExpr: - if _, ok := t.X.(*ast.Ident); ok { - // only possible for qualified type names; - // assume type is imported - return t.Sel.Name, true - } - case *ast.ParenExpr: - return baseTypeName(t.X) - case *ast.StarExpr: - return baseTypeName(t.X) - } - return "", false -} - -// An embeddedSet describes a set of embedded types. -type embeddedSet map[*namedType]bool - -// A namedType represents a named unqualified (package local, or possibly -// predeclared) type. The namedType for a type name is always found via -// reader.lookupType. -type namedType struct { - doc string // doc comment for type - name string // type name - decl *ast.GenDecl // nil if declaration hasn't been seen yet - - isEmbedded bool // true if this type is embedded - isStruct bool // true if this type is a struct - embedded embeddedSet // true if the embedded type is a pointer - - // associated declarations - values []*Value // consts and vars - funcs methodSet - methods methodSet -} - -// ---------------------------------------------------------------------------- -// AST reader - -// reader accumulates documentation for a single package. -// It modifies the AST: Comments (declaration documentation) -// that have been collected by the reader are set to nil -// in the respective AST nodes so that they are not printed -// twice (once when printing the documentation and once when -// printing the corresponding AST node). -type reader struct { - mode Mode - - // package properties - doc string // package documentation, if any - filenames []string - notes map[string][]*Note - - // imports - imports map[string]int - hasDotImp bool // if set, package contains a dot import - importByName map[string]string - - // declarations - values []*Value // consts and vars - order int // sort order of const and var declarations (when we can't use a name) - types map[string]*namedType - funcs methodSet - - // support for package-local shadowing of predeclared types - shadowedPredecl map[string]bool - fixmap map[string][]*ast.InterfaceType -} - -func (r *reader) isVisible(name string) bool { - return r.mode&AllDecls != 0 || token.IsExported(name) -} - -// lookupType returns the base type with the given name. -// If the base type has not been encountered yet, a new -// type with the given name but no associated declaration -// is added to the type map. -func (r *reader) lookupType(name string) *namedType { - if name == "" || name == "_" { - return nil // no type docs for anonymous types - } - if typ, found := r.types[name]; found { - return typ - } - // type not found - add one without declaration - typ := &namedType{ - name: name, - embedded: make(embeddedSet), - funcs: make(methodSet), - methods: make(methodSet), - } - r.types[name] = typ - return typ -} - -// recordAnonymousField registers fieldType as the type of an -// anonymous field in the parent type. If the field is imported -// (qualified name) or the parent is nil, the field is ignored. -// The function returns the field name. -func (r *reader) recordAnonymousField(parent *namedType, fieldType ast.Expr) (fname string) { - fname, imp := baseTypeName(fieldType) - if parent == nil || imp { - return - } - if ftype := r.lookupType(fname); ftype != nil { - ftype.isEmbedded = true - _, ptr := fieldType.(*ast.StarExpr) - parent.embedded[ftype] = ptr - } - return -} - -func (r *reader) readDoc(comment *ast.CommentGroup) { - // By convention there should be only one package comment - // but collect all of them if there are more than one. - text := comment.Text() - if r.doc == "" { - r.doc = text - return - } - r.doc += "\n" + text -} - -func (r *reader) remember(predecl string, typ *ast.InterfaceType) { - if r.fixmap == nil { - r.fixmap = make(map[string][]*ast.InterfaceType) - } - r.fixmap[predecl] = append(r.fixmap[predecl], typ) -} - -func specNames(specs []ast.Spec) []string { - names := make([]string, 0, len(specs)) // reasonable estimate - for _, s := range specs { - // s guaranteed to be an *ast.ValueSpec by readValue - for _, ident := range s.(*ast.ValueSpec).Names { - names = append(names, ident.Name) - } - } - return names -} - -// readValue processes a const or var declaration. -func (r *reader) readValue(decl *ast.GenDecl) { - // determine if decl should be associated with a type - // Heuristic: For each typed entry, determine the type name, if any. - // If there is exactly one type name that is sufficiently - // frequent, associate the decl with the respective type. - domName := "" - domFreq := 0 - prev := "" - n := 0 - for _, spec := range decl.Specs { - s, ok := spec.(*ast.ValueSpec) - if !ok { - continue // should not happen, but be conservative - } - name := "" - switch { - case s.Type != nil: - // a type is present; determine its name - if n, imp := baseTypeName(s.Type); !imp { - name = n - } - case decl.Tok == token.CONST && len(s.Values) == 0: - // no type or value is present but we have a constant declaration; - // use the previous type name (possibly the empty string) - name = prev - } - if name != "" { - // entry has a named type - if domName != "" && domName != name { - // more than one type name - do not associate - // with any type - domName = "" - break - } - domName = name - domFreq++ - } - prev = name - n++ - } - - // nothing to do w/o a legal declaration - if n == 0 { - return - } - - // determine values list with which to associate the Value for this decl - values := &r.values - const threshold = 0.75 - if domName != "" && r.isVisible(domName) && domFreq >= int(float64(len(decl.Specs))*threshold) { - // typed entries are sufficiently frequent - if typ := r.lookupType(domName); typ != nil { - values = &typ.values // associate with that type - } - } - - *values = append(*values, &Value{ - Doc: decl.Doc.Text(), - Names: specNames(decl.Specs), - Decl: decl, - order: r.order, - }) - if r.mode&PreserveAST == 0 { - decl.Doc = nil // doc consumed - remove from AST - } - // Note: It's important that the order used here is global because the cleanupTypes - // methods may move values associated with types back into the global list. If the - // order is list-specific, sorting is not deterministic because the same order value - // may appear multiple times (was bug, found when fixing #16153). - r.order++ -} - -// fields returns a struct's fields or an interface's methods. -func fields(typ ast.Expr) (list []*ast.Field, isStruct bool) { - var fields *ast.FieldList - switch t := typ.(type) { - case *ast.StructType: - fields = t.Fields - isStruct = true - case *ast.InterfaceType: - fields = t.Methods - } - if fields != nil { - list = fields.List - } - return -} - -// readType processes a type declaration. -func (r *reader) readType(decl *ast.GenDecl, spec *ast.TypeSpec) { - typ := r.lookupType(spec.Name.Name) - if typ == nil { - return // no name or blank name - ignore the type - } - - // A type should be added at most once, so typ.decl - // should be nil - if it is not, simply overwrite it. - typ.decl = decl - - // compute documentation - doc := spec.Doc - if doc == nil { - // no doc associated with the spec, use the declaration doc, if any - doc = decl.Doc - } - if r.mode&PreserveAST == 0 { - spec.Doc = nil // doc consumed - remove from AST - decl.Doc = nil // doc consumed - remove from AST - } - typ.doc = doc.Text() - - // record anonymous fields (they may contribute methods) - // (some fields may have been recorded already when filtering - // exports, but that's ok) - var list []*ast.Field - list, typ.isStruct = fields(spec.Type) - for _, field := range list { - if len(field.Names) == 0 { - r.recordAnonymousField(typ, field.Type) - } - } -} - -// isPredeclared reports whether n denotes a predeclared type. -func (r *reader) isPredeclared(n string) bool { - return predeclaredTypes[n] && r.types[n] == nil -} - -// readFunc processes a func or method declaration. -func (r *reader) readFunc(fun *ast.FuncDecl) { - // strip function body if requested. - if r.mode&PreserveAST == 0 { - fun.Body = nil - } - - // associate methods with the receiver type, if any - if fun.Recv != nil { - // method - if len(fun.Recv.List) == 0 { - // should not happen (incorrect AST); (See issue 17788) - // don't show this method - return - } - recvTypeName, imp := baseTypeName(fun.Recv.List[0].Type) - if imp { - // should not happen (incorrect AST); - // don't show this method - return - } - if typ := r.lookupType(recvTypeName); typ != nil { - typ.methods.set(fun, r.mode&PreserveAST != 0) - } - // otherwise ignore the method - // TODO(gri): There may be exported methods of non-exported types - // that can be called because of exported values (consts, vars, or - // function results) of that type. Could determine if that is the - // case and then show those methods in an appropriate section. - return - } - - // Associate factory functions with the first visible result type, as long as - // others are predeclared types. - if fun.Type.Results.NumFields() >= 1 { - var typ *namedType // type to associate the function with - numResultTypes := 0 - for _, res := range fun.Type.Results.List { - factoryType := res.Type - if t, ok := factoryType.(*ast.ArrayType); ok { - // We consider functions that return slices or arrays of type - // T (or pointers to T) as factory functions of T. - factoryType = t.Elt - } - if n, imp := baseTypeName(factoryType); !imp && r.isVisible(n) && !r.isPredeclared(n) { - if lookupTypeParam(n, fun.Type.TypeParams) != nil { - // Issue #49477: don't associate fun with its type parameter result. - // A type parameter is not a defined type. - continue - } - if t := r.lookupType(n); t != nil { - typ = t - numResultTypes++ - if numResultTypes > 1 { - break - } - } - } - } - // If there is exactly one result type, - // associate the function with that type. - if numResultTypes == 1 { - typ.funcs.set(fun, r.mode&PreserveAST != 0) - return - } - } - - // just an ordinary function - r.funcs.set(fun, r.mode&PreserveAST != 0) -} - -// lookupTypeParam searches for type parameters named name within the tparams -// field list, returning the relevant identifier if found, or nil if not. -func lookupTypeParam(name string, tparams *ast.FieldList) *ast.Ident { - if tparams == nil { - return nil - } - for _, field := range tparams.List { - for _, id := range field.Names { - if id.Name == name { - return id - } - } - } - return nil -} - -var ( - noteMarker = `([A-Z][A-Z]+)\(([^)]+)\):?` // MARKER(uid), MARKER at least 2 chars, uid at least 1 char - noteMarkerRx = regexp.MustCompile(`^[ \t]*` + noteMarker) // MARKER(uid) at text start - noteCommentRx = regexp.MustCompile(`^/[/*][ \t]*` + noteMarker) // MARKER(uid) at comment start -) - -// clean replaces each sequence of space, \r, or \t characters -// with a single space and removes any trailing and leading spaces. -func clean(s string) string { - var b []byte - p := byte(' ') - for i := 0; i < len(s); i++ { - q := s[i] - if q == '\r' || q == '\t' { - q = ' ' - } - if q != ' ' || p != ' ' { - b = append(b, q) - p = q - } - } - // remove trailing blank, if any - if n := len(b); n > 0 && p == ' ' { - b = b[0 : n-1] - } - return string(b) -} - -// readNote collects a single note from a sequence of comments. -func (r *reader) readNote(list []*ast.Comment) { - text := (&ast.CommentGroup{List: list}).Text() - if m := noteMarkerRx.FindStringSubmatchIndex(text); m != nil { - // The note body starts after the marker. - // We remove any formatting so that we don't - // get spurious line breaks/indentation when - // showing the TODO body. - body := clean(text[m[1]:]) - if body != "" { - marker := text[m[2]:m[3]] - r.notes[marker] = append(r.notes[marker], &Note{ - Pos: list[0].Pos(), - End: list[len(list)-1].End(), - UID: text[m[4]:m[5]], - Body: body, - }) - } - } -} - -// readNotes extracts notes from comments. -// A note must start at the beginning of a comment with "MARKER(uid):" -// and is followed by the note body (e.g., "// BUG(gri): fix this"). -// The note ends at the end of the comment group or at the start of -// another note in the same comment group, whichever comes first. -func (r *reader) readNotes(comments []*ast.CommentGroup) { - for _, group := range comments { - i := -1 // comment index of most recent note start, valid if >= 0 - list := group.List - for j, c := range list { - if noteCommentRx.MatchString(c.Text) { - if i >= 0 { - r.readNote(list[i:j]) - } - i = j - } - } - if i >= 0 { - r.readNote(list[i:]) - } - } -} - -// readFile adds the AST for a source file to the reader. -func (r *reader) readFile(src *ast.File) { - // add package documentation - if src.Doc != nil { - r.readDoc(src.Doc) - if r.mode&PreserveAST == 0 { - src.Doc = nil // doc consumed - remove from AST - } - } - - // add all declarations but for functions which are processed in a separate pass - for _, decl := range src.Decls { - switch d := decl.(type) { - case *ast.GenDecl: - switch d.Tok { - case token.IMPORT: - // imports are handled individually - for _, spec := range d.Specs { - if s, ok := spec.(*ast.ImportSpec); ok { - if import_, err := strconv.Unquote(s.Path.Value); err == nil { - r.imports[import_] = 1 - var name string - if s.Name != nil { - name = s.Name.Name - if name == "." { - r.hasDotImp = true - } - } - if name != "." { - if name == "" { - name = assumedPackageName(import_) - } - old, ok := r.importByName[name] - if !ok { - r.importByName[name] = import_ - } else if old != import_ && old != "" { - r.importByName[name] = "" // ambiguous - } - } - } - } - } - case token.CONST, token.VAR: - // constants and variables are always handled as a group - r.readValue(d) - case token.TYPE: - // types are handled individually - if len(d.Specs) == 1 && !d.Lparen.IsValid() { - // common case: single declaration w/o parentheses - // (if a single declaration is parenthesized, - // create a new fake declaration below, so that - // go/doc type declarations always appear w/o - // parentheses) - if s, ok := d.Specs[0].(*ast.TypeSpec); ok { - r.readType(d, s) - } - break - } - for _, spec := range d.Specs { - if s, ok := spec.(*ast.TypeSpec); ok { - // use an individual (possibly fake) declaration - // for each type; this also ensures that each type - // gets to (re-)use the declaration documentation - // if there's none associated with the spec itself - fake := &ast.GenDecl{ - Doc: d.Doc, - // don't use the existing TokPos because it - // will lead to the wrong selection range for - // the fake declaration if there are more - // than one type in the group (this affects - // src/cmd/godoc/godoc.go's posLink_urlFunc) - TokPos: s.Pos(), - Tok: token.TYPE, - Specs: []ast.Spec{s}, - } - r.readType(fake, s) - } - } - } - } - } - - // collect MARKER(...): annotations - r.readNotes(src.Comments) - if r.mode&PreserveAST == 0 { - src.Comments = nil // consumed unassociated comments - remove from AST - } -} - -func (r *reader) readPackage(pkg *ast.Package, mode Mode) { - // initialize reader - r.filenames = make([]string, len(pkg.Files)) - r.imports = make(map[string]int) - r.mode = mode - r.types = make(map[string]*namedType) - r.funcs = make(methodSet) - r.notes = make(map[string][]*Note) - r.importByName = make(map[string]string) - - // sort package files before reading them so that the - // result does not depend on map iteration order - i := 0 - for filename := range pkg.Files { - r.filenames[i] = filename - i++ - } - sort.Strings(r.filenames) - - // process files in sorted order - for _, filename := range r.filenames { - f := pkg.Files[filename] - if mode&AllDecls == 0 { - r.fileExports(f) - } - r.readFile(f) - } - - for name, path := range r.importByName { - if path == "" { - delete(r.importByName, name) - } - } - - // process functions now that we have better type information - for _, f := range pkg.Files { - for _, decl := range f.Decls { - if d, ok := decl.(*ast.FuncDecl); ok { - r.readFunc(d) - } - } - } -} - -// ---------------------------------------------------------------------------- -// Types - -func customizeRecv(f *Func, recvTypeName string, embeddedIsPtr bool, level int) *Func { - if f == nil || f.Decl == nil || f.Decl.Recv == nil || len(f.Decl.Recv.List) != 1 { - return f // shouldn't happen, but be safe - } - - // copy existing receiver field and set new type - newField := *f.Decl.Recv.List[0] - origPos := newField.Type.Pos() - _, origRecvIsPtr := newField.Type.(*ast.StarExpr) - newIdent := &ast.Ident{NamePos: origPos, Name: recvTypeName} - var typ ast.Expr = newIdent - if !embeddedIsPtr && origRecvIsPtr { - newIdent.NamePos++ // '*' is one character - typ = &ast.StarExpr{Star: origPos, X: newIdent} - } - newField.Type = typ - - // copy existing receiver field list and set new receiver field - newFieldList := *f.Decl.Recv - newFieldList.List = []*ast.Field{&newField} - - // copy existing function declaration and set new receiver field list - newFuncDecl := *f.Decl - newFuncDecl.Recv = &newFieldList - - // copy existing function documentation and set new declaration - newF := *f - newF.Decl = &newFuncDecl - newF.Recv = recvString(typ) - // the Orig field never changes - newF.Level = level - - return &newF -} - -// collectEmbeddedMethods collects the embedded methods of typ in mset. -func (r *reader) collectEmbeddedMethods(mset methodSet, typ *namedType, recvTypeName string, embeddedIsPtr bool, level int, visited embeddedSet) { - visited[typ] = true - for embedded, isPtr := range typ.embedded { - // Once an embedded type is embedded as a pointer type - // all embedded types in those types are treated like - // pointer types for the purpose of the receiver type - // computation; i.e., embeddedIsPtr is sticky for this - // embedding hierarchy. - thisEmbeddedIsPtr := embeddedIsPtr || isPtr - for _, m := range embedded.methods { - // only top-level methods are embedded - if m.Level == 0 { - mset.add(customizeRecv(m, recvTypeName, thisEmbeddedIsPtr, level)) - } - } - if !visited[embedded] { - r.collectEmbeddedMethods(mset, embedded, recvTypeName, thisEmbeddedIsPtr, level+1, visited) - } - } - delete(visited, typ) -} - -// computeMethodSets determines the actual method sets for each type encountered. -func (r *reader) computeMethodSets() { - for _, t := range r.types { - // collect embedded methods for t - if t.isStruct { - // struct - r.collectEmbeddedMethods(t.methods, t, t.name, false, 1, make(embeddedSet)) - } else { - // interface - // TODO(gri) fix this - } - } - - // For any predeclared names that are declared locally, don't treat them as - // exported fields anymore. - for predecl := range r.shadowedPredecl { - for _, ityp := range r.fixmap[predecl] { - removeAnonymousField(predecl, ityp) - } - } -} - -// cleanupTypes removes the association of functions and methods with -// types that have no declaration. Instead, these functions and methods -// are shown at the package level. It also removes types with missing -// declarations or which are not visible. -func (r *reader) cleanupTypes() { - for _, t := range r.types { - visible := r.isVisible(t.name) - predeclared := predeclaredTypes[t.name] - - if t.decl == nil && (predeclared || visible && (t.isEmbedded || r.hasDotImp)) { - // t.name is a predeclared type (and was not redeclared in this package), - // or it was embedded somewhere but its declaration is missing (because - // the AST is incomplete), or we have a dot-import (and all bets are off): - // move any associated values, funcs, and methods back to the top-level so - // that they are not lost. - // 1) move values - r.values = append(r.values, t.values...) - // 2) move factory functions - for name, f := range t.funcs { - // in a correct AST, package-level function names - // are all different - no need to check for conflicts - r.funcs[name] = f - } - // 3) move methods - if !predeclared { - for name, m := range t.methods { - // don't overwrite functions with the same name - drop them - if _, found := r.funcs[name]; !found { - r.funcs[name] = m - } - } - } - } - // remove types w/o declaration or which are not visible - if t.decl == nil || !visible { - delete(r.types, t.name) - } - } -} - -// ---------------------------------------------------------------------------- -// Sorting - -type data struct { - n int - swap func(i, j int) - less func(i, j int) bool -} - -func (d *data) Len() int { return d.n } -func (d *data) Swap(i, j int) { d.swap(i, j) } -func (d *data) Less(i, j int) bool { return d.less(i, j) } - -// sortBy is a helper function for sorting -func sortBy(less func(i, j int) bool, swap func(i, j int), n int) { - sort.Sort(&data{n, swap, less}) -} - -func sortedKeys(m map[string]int) []string { - list := make([]string, len(m)) - i := 0 - for key := range m { - list[i] = key - i++ - } - sort.Strings(list) - return list -} - -// sortingName returns the name to use when sorting d into place. -func sortingName(d *ast.GenDecl) string { - if len(d.Specs) == 1 { - if s, ok := d.Specs[0].(*ast.ValueSpec); ok { - return s.Names[0].Name - } - } - return "" -} - -func sortedValues(m []*Value, tok token.Token) []*Value { - list := make([]*Value, len(m)) // big enough in any case - i := 0 - for _, val := range m { - if val.Decl.Tok == tok { - list[i] = val - i++ - } - } - list = list[0:i] - - sortBy( - func(i, j int) bool { - if ni, nj := sortingName(list[i].Decl), sortingName(list[j].Decl); ni != nj { - return ni < nj - } - return list[i].order < list[j].order - }, - func(i, j int) { list[i], list[j] = list[j], list[i] }, - len(list), - ) - - return list -} - -func sortedTypes(m map[string]*namedType, allMethods bool) []*Type { - list := make([]*Type, len(m)) - i := 0 - for _, t := range m { - list[i] = &Type{ - Doc: t.doc, - Name: t.name, - Decl: t.decl, - Consts: sortedValues(t.values, token.CONST), - Vars: sortedValues(t.values, token.VAR), - Funcs: sortedFuncs(t.funcs, true), - Methods: sortedFuncs(t.methods, allMethods), - } - i++ - } - - sortBy( - func(i, j int) bool { return list[i].Name < list[j].Name }, - func(i, j int) { list[i], list[j] = list[j], list[i] }, - len(list), - ) - - return list -} - -func removeStar(s string) string { - if len(s) > 0 && s[0] == '*' { - return s[1:] - } - return s -} - -func sortedFuncs(m methodSet, allMethods bool) []*Func { - list := make([]*Func, len(m)) - i := 0 - for _, m := range m { - // determine which methods to include - switch { - case m.Decl == nil: - // exclude conflict entry - case allMethods, m.Level == 0, !token.IsExported(removeStar(m.Orig)): - // forced inclusion, method not embedded, or method - // embedded but original receiver type not exported - list[i] = m - i++ - } - } - list = list[0:i] - sortBy( - func(i, j int) bool { return list[i].Name < list[j].Name }, - func(i, j int) { list[i], list[j] = list[j], list[i] }, - len(list), - ) - return list -} - -// noteBodies returns a list of note body strings given a list of notes. -// This is only used to populate the deprecated Package.Bugs field. -func noteBodies(notes []*Note) []string { - var list []string - for _, n := range notes { - list = append(list, n.Body) - } - return list -} - -// ---------------------------------------------------------------------------- -// Predeclared identifiers - -// IsPredeclared reports whether s is a predeclared identifier. -func IsPredeclared(s string) bool { - return predeclaredTypes[s] || predeclaredFuncs[s] || predeclaredConstants[s] -} - -var predeclaredTypes = map[string]bool{ - "interface{}": true, - "bool": true, - "byte": true, - "comparable": true, - "complex64": true, - "complex128": true, - "error": true, - "float32": true, - "float64": true, - "int": true, - "int8": true, - "int16": true, - "int32": true, - "int64": true, - "rune": true, - "string": true, - "uint": true, - "uint8": true, - "uint16": true, - "uint32": true, - "uint64": true, - "uintptr": true, -} - -var predeclaredFuncs = map[string]bool{ - "append": true, - "cap": true, - "close": true, - "complex": true, - "copy": true, - "delete": true, - "imag": true, - "len": true, - "make": true, - "new": true, - "panic": true, - "print": true, - "println": true, - "real": true, - "recover": true, -} - -var predeclaredConstants = map[string]bool{ - "false": true, - "iota": true, - "nil": true, - "true": true, -} - -// assumedPackageName returns the assumed package name -// for a given import path. This is a copy of -// golang.org/x/tools/internal/imports.ImportPathToAssumedName. -func assumedPackageName(importPath string) string { - notIdentifier := func(ch rune) bool { - return !('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || - '0' <= ch && ch <= '9' || - ch == '_' || - ch >= utf8.RuneSelf && (unicode.IsLetter(ch) || unicode.IsDigit(ch))) - } - - base := path.Base(importPath) - if strings.HasPrefix(base, "v") { - if _, err := strconv.Atoi(base[1:]); err == nil { - dir := path.Dir(importPath) - if dir != "." { - base = path.Base(dir) - } - } - } - base = strings.TrimPrefix(base, "go-") - if i := strings.IndexFunc(base, notIdentifier); i >= 0 { - base = base[:i] - } - return base -} diff --git a/internal/backport/go/doc/synopsis.go b/internal/backport/go/doc/synopsis.go deleted file mode 100644 index 7ac23e330d..0000000000 --- a/internal/backport/go/doc/synopsis.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import ( - "strings" - "unicode" - - "golang.org/x/website/internal/backport/go/doc/comment" -) - -// firstSentence returns the first sentence in s. -// The sentence ends after the first period followed by space and -// not preceded by exactly one uppercase letter. -func firstSentence(s string) string { - var ppp, pp, p rune - for i, q := range s { - if q == '\n' || q == '\r' || q == '\t' { - q = ' ' - } - if q == ' ' && p == '.' && (!unicode.IsUpper(pp) || unicode.IsUpper(ppp)) { - return s[:i] - } - if p == '。' || p == '.' { - return s[:i] - } - ppp, pp, p = pp, p, q - } - return s -} - -// Synopsis returns a cleaned version of the first sentence in text. -// -// Deprecated: New programs should use [Package.Synopsis] instead, -// which handles links in text properly. -func Synopsis(text string) string { - var p Package - return p.Synopsis(text) -} - -// IllegalPrefixes is a list of lower-case prefixes that identify -// a comment as not being a doc comment. -// This helps to avoid misinterpreting the common mistake -// of a copyright notice immediately before a package statement -// as being a doc comment. -var IllegalPrefixes = []string{ - "copyright", - "all rights", - "author", -} - -// Synopsis returns a cleaned version of the first sentence in text. -// That sentence ends after the first period followed by space and not -// preceded by exactly one uppercase letter, or at the first paragraph break. -// The result string has no \n, \r, or \t characters and uses only single -// spaces between words. If text starts with any of the IllegalPrefixes, -// the result is the empty string. -func (p *Package) Synopsis(text string) string { - text = firstSentence(text) - lower := strings.ToLower(text) - for _, prefix := range IllegalPrefixes { - if strings.HasPrefix(lower, prefix) { - return "" - } - } - pr := p.Printer() - pr.TextWidth = -1 - d := p.Parser().Parse(text) - if len(d.Content) == 0 { - return "" - } - if _, ok := d.Content[0].(*comment.Paragraph); !ok { - return "" - } - d.Content = d.Content[:1] // might be blank lines, code blocks, etc in “first sentence” - return strings.TrimSpace(string(pr.Text(d))) -} diff --git a/internal/backport/go/doc/synopsis_test.go b/internal/backport/go/doc/synopsis_test.go deleted file mode 100644 index 158c734bf0..0000000000 --- a/internal/backport/go/doc/synopsis_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package doc - -import "testing" - -var tests = []struct { - txt string - fsl int - syn string -}{ - {"", 0, ""}, - {"foo", 3, "foo"}, - {"foo.", 4, "foo."}, - {"foo.bar", 7, "foo.bar"}, - {" foo. ", 6, "foo."}, - {" foo\t bar.\n", 12, "foo bar."}, - {" foo\t bar.\n", 12, "foo bar."}, - {"a b\n\nc\r\rd\t\t", 12, "a b"}, - {"a b\n\nc\r\rd\t\t . BLA", 15, "a b"}, - {"Package poems by T.S.Eliot. To rhyme...", 27, "Package poems by T.S.Eliot."}, - {"Package poems by T. S. Eliot. To rhyme...", 29, "Package poems by T. S. Eliot."}, - {"foo implements the foo ABI. The foo ABI is...", 27, "foo implements the foo ABI."}, - {"Package\nfoo. ..", 12, "Package foo."}, - {"P . Q.", 3, "P ."}, - {"P. Q. ", 8, "P. Q."}, - {"Package Καλημέρα κόσμε.", 36, "Package Καλημέρα κόσμε."}, - {"Package こんにちは 世界\n", 31, "Package こんにちは 世界"}, - {"Package こんにちは。世界", 26, "Package こんにちは。"}, - {"Package 안녕.世界", 17, "Package 안녕."}, - {"Package foo does bar.", 21, "Package foo does bar."}, - {"Copyright 2012 Google, Inc. Package foo does bar.", 27, ""}, - {"All Rights reserved. Package foo does bar.", 20, ""}, - {"All rights reserved. Package foo does bar.", 20, ""}, - {"Authors: foo@bar.com. Package foo does bar.", 21, ""}, - {"typically invoked as ``go tool asm'',", 37, "typically invoked as “go tool asm”,"}, -} - -func TestSynopsis(t *testing.T) { - for _, e := range tests { - fs := firstSentence(e.txt) - if fs != e.txt[:e.fsl] { - t.Errorf("firstSentence(%q) = %q, want %q", e.txt, fs, e.txt[:e.fsl]) - } - syn := Synopsis(e.txt) - if syn != e.syn { - t.Errorf("Synopsis(%q) = %q, want %q", e.txt, syn, e.syn) - } - } -} diff --git a/internal/backport/go/doc/testdata/a.0.golden b/internal/backport/go/doc/testdata/a.0.golden deleted file mode 100644 index 7e680b80b4..0000000000 --- a/internal/backport/go/doc/testdata/a.0.golden +++ /dev/null @@ -1,52 +0,0 @@ -// comment 0 comment 1 -PACKAGE a - -IMPORTPATH - testdata/a - -FILENAMES - testdata/a0.go - testdata/a1.go - -BUGS .Bugs is now deprecated, please use .Notes instead - bug0 - - bug1 - - -BUGS -BUG(uid) bug0 - -BUG(uid) bug1 - - -NOTES -NOTE(uid) - -NOTE(foo) 1 of 4 - this is the first line of note 1 - - note 1 continues on this 2nd line - - note 1 continues on this 3rd line - -NOTE(foo) 2 of 4 - -NOTE(bar) 3 of 4 - -NOTE(bar) 4 of 4 - - this is the last line of note 4 - -NOTE(bam) This note which contains a (parenthesized) subphrase - must appear in its entirety. - -NOTE(xxx) The ':' after the marker and uid is optional. - - -SECBUGS -SECBUG(uid) sec hole 0 - need to fix asap - - -TODOS -TODO(uid) todo0 - -TODO(uid) todo1 - diff --git a/internal/backport/go/doc/testdata/a.1.golden b/internal/backport/go/doc/testdata/a.1.golden deleted file mode 100644 index 7e680b80b4..0000000000 --- a/internal/backport/go/doc/testdata/a.1.golden +++ /dev/null @@ -1,52 +0,0 @@ -// comment 0 comment 1 -PACKAGE a - -IMPORTPATH - testdata/a - -FILENAMES - testdata/a0.go - testdata/a1.go - -BUGS .Bugs is now deprecated, please use .Notes instead - bug0 - - bug1 - - -BUGS -BUG(uid) bug0 - -BUG(uid) bug1 - - -NOTES -NOTE(uid) - -NOTE(foo) 1 of 4 - this is the first line of note 1 - - note 1 continues on this 2nd line - - note 1 continues on this 3rd line - -NOTE(foo) 2 of 4 - -NOTE(bar) 3 of 4 - -NOTE(bar) 4 of 4 - - this is the last line of note 4 - -NOTE(bam) This note which contains a (parenthesized) subphrase - must appear in its entirety. - -NOTE(xxx) The ':' after the marker and uid is optional. - - -SECBUGS -SECBUG(uid) sec hole 0 - need to fix asap - - -TODOS -TODO(uid) todo0 - -TODO(uid) todo1 - diff --git a/internal/backport/go/doc/testdata/a.2.golden b/internal/backport/go/doc/testdata/a.2.golden deleted file mode 100644 index 7e680b80b4..0000000000 --- a/internal/backport/go/doc/testdata/a.2.golden +++ /dev/null @@ -1,52 +0,0 @@ -// comment 0 comment 1 -PACKAGE a - -IMPORTPATH - testdata/a - -FILENAMES - testdata/a0.go - testdata/a1.go - -BUGS .Bugs is now deprecated, please use .Notes instead - bug0 - - bug1 - - -BUGS -BUG(uid) bug0 - -BUG(uid) bug1 - - -NOTES -NOTE(uid) - -NOTE(foo) 1 of 4 - this is the first line of note 1 - - note 1 continues on this 2nd line - - note 1 continues on this 3rd line - -NOTE(foo) 2 of 4 - -NOTE(bar) 3 of 4 - -NOTE(bar) 4 of 4 - - this is the last line of note 4 - -NOTE(bam) This note which contains a (parenthesized) subphrase - must appear in its entirety. - -NOTE(xxx) The ':' after the marker and uid is optional. - - -SECBUGS -SECBUG(uid) sec hole 0 - need to fix asap - - -TODOS -TODO(uid) todo0 - -TODO(uid) todo1 - diff --git a/internal/backport/go/doc/testdata/a0.go b/internal/backport/go/doc/testdata/a0.go deleted file mode 100644 index 2420c8a483..0000000000 --- a/internal/backport/go/doc/testdata/a0.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// comment 0 -package a - -//BUG(uid): bug0 - -//TODO(uid): todo0 - -// A note with some spaces after it, should be ignored (watch out for -// emacs modes that remove trailing whitespace). -//NOTE(uid): - -// SECBUG(uid): sec hole 0 -// need to fix asap - -// Multiple notes may be in the same comment group and should be -// recognized individually. Notes may start in the middle of a -// comment group as long as they start at the beginning of an -// individual comment. -// -// NOTE(foo): 1 of 4 - this is the first line of note 1 -// - note 1 continues on this 2nd line -// - note 1 continues on this 3rd line -// NOTE(foo): 2 of 4 -// NOTE(bar): 3 of 4 -/* NOTE(bar): 4 of 4 */ -// - this is the last line of note 4 -// -// - -// NOTE(bam): This note which contains a (parenthesized) subphrase -// must appear in its entirety. - -// NOTE(xxx) The ':' after the marker and uid is optional. - -// NOTE(): NO uid - should not show up. -// NOTE() NO uid - should not show up. diff --git a/internal/backport/go/doc/testdata/a1.go b/internal/backport/go/doc/testdata/a1.go deleted file mode 100644 index 9fad1e09bc..0000000000 --- a/internal/backport/go/doc/testdata/a1.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// comment 1 -package a - -//BUG(uid): bug1 - -//TODO(uid): todo1 - -//TODO(): ignored diff --git a/internal/backport/go/doc/testdata/b.0.golden b/internal/backport/go/doc/testdata/b.0.golden deleted file mode 100644 index c06246a7b1..0000000000 --- a/internal/backport/go/doc/testdata/b.0.golden +++ /dev/null @@ -1,74 +0,0 @@ -// -PACKAGE b - -IMPORTPATH - testdata/b - -IMPORTS - a - -FILENAMES - testdata/b.go - -CONSTANTS - // - const ( - C1 notExported = iota - C2 - - C4 - C5 - ) - - // - const C notExported = 0 - - // - const Pi = 3.14 // Pi - - -VARIABLES - // - var ( - U1, U2, U4, U5 notExported - - U7 notExported = 7 - ) - - // - var MaxInt int // MaxInt - - // - var V notExported - - // - var V1, V2, V4, V5 notExported - - -FUNCTIONS - // Associated with comparable type if AllDecls is set. - func ComparableFactory() comparable - - // - func F(x int) int - - // - func F1() notExported - - // Always under the package functions list. - func NotAFactory() int - - // Associated with uint type if AllDecls is set. - func UintFactory() uint - - -TYPES - // - type T struct{} // T - - // - var V T // v - - // - func (x *T) M() - diff --git a/internal/backport/go/doc/testdata/b.1.golden b/internal/backport/go/doc/testdata/b.1.golden deleted file mode 100644 index 2b62c3400c..0000000000 --- a/internal/backport/go/doc/testdata/b.1.golden +++ /dev/null @@ -1,89 +0,0 @@ -// -PACKAGE b - -IMPORTPATH - testdata/b - -IMPORTS - a - -FILENAMES - testdata/b.go - -CONSTANTS - // - const Pi = 3.14 // Pi - - -VARIABLES - // - var MaxInt int // MaxInt - - -FUNCTIONS - // - func F(x int) int - - // Always under the package functions list. - func NotAFactory() int - - -TYPES - // - type T struct{} // T - - // - var V T // v - - // - func (x *T) M() - - // Should only appear if AllDecls is set. - type comparable struct{} // overrides a predeclared type comparable - - // Associated with comparable type if AllDecls is set. - func ComparableFactory() comparable - - // - type notExported int - - // - const ( - C1 notExported = iota - C2 - c3 - C4 - C5 - ) - - // - const C notExported = 0 - - // - var ( - U1, U2, u3, U4, U5 notExported - u6 notExported - U7 notExported = 7 - ) - - // - var V notExported - - // - var V1, V2, v3, V4, V5 notExported - - // - func F1() notExported - - // - func f2() notExported - - // Should only appear if AllDecls is set. - type uint struct{} // overrides a predeclared type uint - - // Associated with uint type if AllDecls is set. - func UintFactory() uint - - // Associated with uint type if AllDecls is set. - func uintFactory() uint - diff --git a/internal/backport/go/doc/testdata/b.2.golden b/internal/backport/go/doc/testdata/b.2.golden deleted file mode 100644 index c06246a7b1..0000000000 --- a/internal/backport/go/doc/testdata/b.2.golden +++ /dev/null @@ -1,74 +0,0 @@ -// -PACKAGE b - -IMPORTPATH - testdata/b - -IMPORTS - a - -FILENAMES - testdata/b.go - -CONSTANTS - // - const ( - C1 notExported = iota - C2 - - C4 - C5 - ) - - // - const C notExported = 0 - - // - const Pi = 3.14 // Pi - - -VARIABLES - // - var ( - U1, U2, U4, U5 notExported - - U7 notExported = 7 - ) - - // - var MaxInt int // MaxInt - - // - var V notExported - - // - var V1, V2, V4, V5 notExported - - -FUNCTIONS - // Associated with comparable type if AllDecls is set. - func ComparableFactory() comparable - - // - func F(x int) int - - // - func F1() notExported - - // Always under the package functions list. - func NotAFactory() int - - // Associated with uint type if AllDecls is set. - func UintFactory() uint - - -TYPES - // - type T struct{} // T - - // - var V T // v - - // - func (x *T) M() - diff --git a/internal/backport/go/doc/testdata/b.go b/internal/backport/go/doc/testdata/b.go deleted file mode 100644 index 61b512bc8a..0000000000 --- a/internal/backport/go/doc/testdata/b.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package b - -import "a" - -// ---------------------------------------------------------------------------- -// Basic declarations - -const Pi = 3.14 // Pi -var MaxInt int // MaxInt -type T struct{} // T -var V T // v -func F(x int) int {} // F -func (x *T) M() {} // M - -// Corner cases: association with (presumed) predeclared types - -// Always under the package functions list. -func NotAFactory() int {} - -// Associated with uint type if AllDecls is set. -func UintFactory() uint {} - -// Associated with uint type if AllDecls is set. -func uintFactory() uint {} - -// Associated with comparable type if AllDecls is set. -func ComparableFactory() comparable {} - -// Should only appear if AllDecls is set. -type uint struct{} // overrides a predeclared type uint - -// Should only appear if AllDecls is set. -type comparable struct{} // overrides a predeclared type comparable - -// ---------------------------------------------------------------------------- -// Exported declarations associated with non-exported types must always be shown. - -type notExported int - -const C notExported = 0 - -const ( - C1 notExported = iota - C2 - c3 - C4 - C5 -) - -var V notExported -var V1, V2, v3, V4, V5 notExported - -var ( - U1, U2, u3, U4, U5 notExported - u6 notExported - U7 notExported = 7 -) - -func F1() notExported {} -func f2() notExported {} diff --git a/internal/backport/go/doc/testdata/benchmark.go b/internal/backport/go/doc/testdata/benchmark.go deleted file mode 100644 index 61b5cf1a02..0000000000 --- a/internal/backport/go/doc/testdata/benchmark.go +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package testing - -import ( - "flag" - "fmt" - "os" - "runtime" - "time" -) - -var matchBenchmarks = flag.String("test.bench", "", "regular expression to select benchmarks to run") -var benchTime = flag.Duration("test.benchtime", 1*time.Second, "approximate run time for each benchmark") - -// An internal type but exported because it is cross-package; part of the implementation -// of go test. -type InternalBenchmark struct { - Name string - F func(b *B) -} - -// B is a type passed to Benchmark functions to manage benchmark -// timing and to specify the number of iterations to run. -type B struct { - common - N int - benchmark InternalBenchmark - bytes int64 - timerOn bool - result BenchmarkResult -} - -// StartTimer starts timing a test. This function is called automatically -// before a benchmark starts, but it can also used to resume timing after -// a call to StopTimer. -func (b *B) StartTimer() { - if !b.timerOn { - b.start = time.Now() - b.timerOn = true - } -} - -// StopTimer stops timing a test. This can be used to pause the timer -// while performing complex initialization that you don't -// want to measure. -func (b *B) StopTimer() { - if b.timerOn { - b.duration += time.Now().Sub(b.start) - b.timerOn = false - } -} - -// ResetTimer sets the elapsed benchmark time to zero. -// It does not affect whether the timer is running. -func (b *B) ResetTimer() { - if b.timerOn { - b.start = time.Now() - } - b.duration = 0 -} - -// SetBytes records the number of bytes processed in a single operation. -// If this is called, the benchmark will report ns/op and MB/s. -func (b *B) SetBytes(n int64) { b.bytes = n } - -func (b *B) nsPerOp() int64 { - if b.N <= 0 { - return 0 - } - return b.duration.Nanoseconds() / int64(b.N) -} - -// runN runs a single benchmark for the specified number of iterations. -func (b *B) runN(n int) { - // Try to get a comparable environment for each run - // by clearing garbage from previous runs. - runtime.GC() - b.N = n - b.ResetTimer() - b.StartTimer() - b.benchmark.F(b) - b.StopTimer() -} - -func min(x, y int) int { - if x > y { - return y - } - return x -} - -func max(x, y int) int { - if x < y { - return y - } - return x -} - -// roundDown10 rounds a number down to the nearest power of 10. -func roundDown10(n int) int { - var tens = 0 - // tens = floor(log_10(n)) - for n > 10 { - n = n / 10 - tens++ - } - // result = 10^tens - result := 1 - for i := 0; i < tens; i++ { - result *= 10 - } - return result -} - -// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. -func roundUp(n int) int { - base := roundDown10(n) - if n < (2 * base) { - return 2 * base - } - if n < (5 * base) { - return 5 * base - } - return 10 * base -} - -// run times the benchmark function in a separate goroutine. -func (b *B) run() BenchmarkResult { - go b.launch() - <-b.signal - return b.result -} - -// launch launches the benchmark function. It gradually increases the number -// of benchmark iterations until the benchmark runs for a second in order -// to get a reasonable measurement. It prints timing information in this form -// -// testing.BenchmarkHello 100000 19 ns/op -// -// launch is run by the fun function as a separate goroutine. -func (b *B) launch() { - // Run the benchmark for a single iteration in case it's expensive. - n := 1 - - // Signal that we're done whether we return normally - // or by FailNow's runtime.Goexit. - defer func() { - b.signal <- b - }() - - b.runN(n) - // Run the benchmark for at least the specified amount of time. - d := *benchTime - for !b.failed && b.duration < d && n < 1e9 { - last := n - // Predict iterations/sec. - if b.nsPerOp() == 0 { - n = 1e9 - } else { - n = int(d.Nanoseconds() / b.nsPerOp()) - } - // Run more iterations than we think we'll need for a second (1.5x). - // Don't grow too fast in case we had timing errors previously. - // Be sure to run at least one more than last time. - n = max(min(n+n/2, 100*last), last+1) - // Round up to something easy to read. - n = roundUp(n) - b.runN(n) - } - b.result = BenchmarkResult{b.N, b.duration, b.bytes} -} - -// The results of a benchmark run. -type BenchmarkResult struct { - N int // The number of iterations. - T time.Duration // The total time taken. - Bytes int64 // Bytes processed in one iteration. -} - -func (r BenchmarkResult) NsPerOp() int64 { - if r.N <= 0 { - return 0 - } - return r.T.Nanoseconds() / int64(r.N) -} - -func (r BenchmarkResult) mbPerSec() float64 { - if r.Bytes <= 0 || r.T <= 0 || r.N <= 0 { - return 0 - } - return (float64(r.Bytes) * float64(r.N) / 1e6) / r.T.Seconds() -} - -func (r BenchmarkResult) String() string { - mbs := r.mbPerSec() - mb := "" - if mbs != 0 { - mb = fmt.Sprintf("\t%7.2f MB/s", mbs) - } - nsop := r.NsPerOp() - ns := fmt.Sprintf("%10d ns/op", nsop) - if r.N > 0 && nsop < 100 { - // The format specifiers here make sure that - // the ones digits line up for all three possible formats. - if nsop < 10 { - ns = fmt.Sprintf("%13.2f ns/op", float64(r.T.Nanoseconds())/float64(r.N)) - } else { - ns = fmt.Sprintf("%12.1f ns/op", float64(r.T.Nanoseconds())/float64(r.N)) - } - } - return fmt.Sprintf("%8d\t%s%s", r.N, ns, mb) -} - -// An internal function but exported because it is cross-package; part of the implementation -// of go test. -func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark) { - // If no flag was specified, don't run benchmarks. - if len(*matchBenchmarks) == 0 { - return - } - for _, Benchmark := range benchmarks { - matched, err := matchString(*matchBenchmarks, Benchmark.Name) - if err != nil { - fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.bench: %s\n", err) - os.Exit(1) - } - if !matched { - continue - } - for _, procs := range cpuList { - runtime.GOMAXPROCS(procs) - b := &B{ - common: common{ - signal: make(chan interface{}), - }, - benchmark: Benchmark, - } - benchName := Benchmark.Name - if procs != 1 { - benchName = fmt.Sprintf("%s-%d", Benchmark.Name, procs) - } - fmt.Printf("%s\t", benchName) - r := b.run() - if b.failed { - // The output could be very long here, but probably isn't. - // We print it all, regardless, because we don't want to trim the reason - // the benchmark failed. - fmt.Printf("--- FAIL: %s\n%s", benchName, b.output) - continue - } - fmt.Printf("%v\n", r) - // Unlike with tests, we ignore the -chatty flag and always print output for - // benchmarks since the output generation time will skew the results. - if len(b.output) > 0 { - b.trimOutput() - fmt.Printf("--- BENCH: %s\n%s", benchName, b.output) - } - if p := runtime.GOMAXPROCS(-1); p != procs { - fmt.Fprintf(os.Stderr, "testing: %s left GOMAXPROCS set to %d\n", benchName, p) - } - } - } -} - -// trimOutput shortens the output from a benchmark, which can be very long. -func (b *B) trimOutput() { - // The output is likely to appear multiple times because the benchmark - // is run multiple times, but at least it will be seen. This is not a big deal - // because benchmarks rarely print, but just in case, we trim it if it's too long. - const maxNewlines = 10 - for nlCount, j := 0, 0; j < len(b.output); j++ { - if b.output[j] == '\n' { - nlCount++ - if nlCount >= maxNewlines { - b.output = append(b.output[:j], "\n\t... [output truncated]\n"...) - break - } - } - } -} - -// Benchmark benchmarks a single function. Useful for creating -// custom benchmarks that do not use go test. -func Benchmark(f func(b *B)) BenchmarkResult { - b := &B{ - common: common{ - signal: make(chan interface{}), - }, - benchmark: InternalBenchmark{"", f}, - } - return b.run() -} diff --git a/internal/backport/go/doc/testdata/blank.0.golden b/internal/backport/go/doc/testdata/blank.0.golden deleted file mode 100644 index 70f2929f8a..0000000000 --- a/internal/backport/go/doc/testdata/blank.0.golden +++ /dev/null @@ -1,62 +0,0 @@ -// Package blank is a go/doc test for the handling of _. See issue ... -PACKAGE blank - -IMPORTPATH - testdata/blank - -IMPORTS - os - -FILENAMES - testdata/blank.go - -CONSTANTS - // T constants counting from unexported constants. - const ( - C1 T - C2 - - C3 - - C4 int - ) - - // Constants with a single type that is not propagated. - const ( - Default = 0644 - Useless = 0312 - WideOpen = 0777 - ) - - // Constants with an imported type that is propagated. - const ( - M1 os.FileMode - M2 - M3 - ) - - // Package constants. - const ( - I1 int - I2 - ) - - -TYPES - // S has a padding field. - type S struct { - H uint32 - - A uint8 - // contains filtered or unexported fields - } - - // - type T int - - // T constants counting from a blank constant. - const ( - T1 T - T2 - ) - diff --git a/internal/backport/go/doc/testdata/blank.1.golden b/internal/backport/go/doc/testdata/blank.1.golden deleted file mode 100644 index 8098cb6e88..0000000000 --- a/internal/backport/go/doc/testdata/blank.1.golden +++ /dev/null @@ -1,83 +0,0 @@ -// Package blank is a go/doc test for the handling of _. See issue ... -PACKAGE blank - -IMPORTPATH - testdata/blank - -IMPORTS - os - -FILENAMES - testdata/blank.go - -CONSTANTS - // T constants counting from unexported constants. - const ( - tweedledee T = iota - tweedledum - C1 - C2 - alice - C3 - redQueen int = iota - C4 - ) - - // Constants with a single type that is not propagated. - const ( - zero os.FileMode = 0 - Default = 0644 - Useless = 0312 - WideOpen = 0777 - ) - - // Constants with an imported type that is propagated. - const ( - zero os.FileMode = 0 - M1 - M2 - M3 - ) - - // Package constants. - const ( - _ int = iota - I1 - I2 - ) - - // Unexported constants counting from blank iota. See issue 9615. - const ( - _ = iota - one = iota + 1 - ) - - -VARIABLES - // - var _ = T(55) - - -FUNCTIONS - // - func _() - - -TYPES - // S has a padding field. - type S struct { - H uint32 - _ uint8 - A uint8 - } - - // - type T int - - // T constants counting from a blank constant. - const ( - _ T = iota - T1 - T2 - ) - diff --git a/internal/backport/go/doc/testdata/blank.2.golden b/internal/backport/go/doc/testdata/blank.2.golden deleted file mode 100644 index 70f2929f8a..0000000000 --- a/internal/backport/go/doc/testdata/blank.2.golden +++ /dev/null @@ -1,62 +0,0 @@ -// Package blank is a go/doc test for the handling of _. See issue ... -PACKAGE blank - -IMPORTPATH - testdata/blank - -IMPORTS - os - -FILENAMES - testdata/blank.go - -CONSTANTS - // T constants counting from unexported constants. - const ( - C1 T - C2 - - C3 - - C4 int - ) - - // Constants with a single type that is not propagated. - const ( - Default = 0644 - Useless = 0312 - WideOpen = 0777 - ) - - // Constants with an imported type that is propagated. - const ( - M1 os.FileMode - M2 - M3 - ) - - // Package constants. - const ( - I1 int - I2 - ) - - -TYPES - // S has a padding field. - type S struct { - H uint32 - - A uint8 - // contains filtered or unexported fields - } - - // - type T int - - // T constants counting from a blank constant. - const ( - T1 T - T2 - ) - diff --git a/internal/backport/go/doc/testdata/blank.go b/internal/backport/go/doc/testdata/blank.go deleted file mode 100644 index 5ea6186935..0000000000 --- a/internal/backport/go/doc/testdata/blank.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package blank is a go/doc test for the handling of _. -// See issue 5397. -package blank - -import "os" - -type T int - -// T constants counting from a blank constant. -const ( - _ T = iota - T1 - T2 -) - -// T constants counting from unexported constants. -const ( - tweedledee T = iota - tweedledum - C1 - C2 - alice - C3 - redQueen int = iota - C4 -) - -// Constants with a single type that is not propagated. -const ( - zero os.FileMode = 0 - Default = 0644 - Useless = 0312 - WideOpen = 0777 -) - -// Constants with an imported type that is propagated. -const ( - zero os.FileMode = 0 - M1 - M2 - M3 -) - -// Package constants. -const ( - _ int = iota - I1 - I2 -) - -// Unexported constants counting from blank iota. -// See issue 9615. -const ( - _ = iota - one = iota + 1 -) - -// Blanks not in doc output: - -// S has a padding field. -type S struct { - H uint32 - _ uint8 - A uint8 -} - -func _() {} - -type _ T - -var _ = T(55) diff --git a/internal/backport/go/doc/testdata/bugpara.0.golden b/internal/backport/go/doc/testdata/bugpara.0.golden deleted file mode 100644 index 5804859501..0000000000 --- a/internal/backport/go/doc/testdata/bugpara.0.golden +++ /dev/null @@ -1,20 +0,0 @@ -// -PACKAGE bugpara - -IMPORTPATH - testdata/bugpara - -FILENAMES - testdata/bugpara.go - -BUGS .Bugs is now deprecated, please use .Notes instead - Sometimes bugs have multiple paragraphs. - - Like this one. - - -BUGS -BUG(rsc) Sometimes bugs have multiple paragraphs. - - Like this one. - diff --git a/internal/backport/go/doc/testdata/bugpara.1.golden b/internal/backport/go/doc/testdata/bugpara.1.golden deleted file mode 100644 index 5804859501..0000000000 --- a/internal/backport/go/doc/testdata/bugpara.1.golden +++ /dev/null @@ -1,20 +0,0 @@ -// -PACKAGE bugpara - -IMPORTPATH - testdata/bugpara - -FILENAMES - testdata/bugpara.go - -BUGS .Bugs is now deprecated, please use .Notes instead - Sometimes bugs have multiple paragraphs. - - Like this one. - - -BUGS -BUG(rsc) Sometimes bugs have multiple paragraphs. - - Like this one. - diff --git a/internal/backport/go/doc/testdata/bugpara.2.golden b/internal/backport/go/doc/testdata/bugpara.2.golden deleted file mode 100644 index 5804859501..0000000000 --- a/internal/backport/go/doc/testdata/bugpara.2.golden +++ /dev/null @@ -1,20 +0,0 @@ -// -PACKAGE bugpara - -IMPORTPATH - testdata/bugpara - -FILENAMES - testdata/bugpara.go - -BUGS .Bugs is now deprecated, please use .Notes instead - Sometimes bugs have multiple paragraphs. - - Like this one. - - -BUGS -BUG(rsc) Sometimes bugs have multiple paragraphs. - - Like this one. - diff --git a/internal/backport/go/doc/testdata/bugpara.go b/internal/backport/go/doc/testdata/bugpara.go deleted file mode 100644 index 0360a6f667..0000000000 --- a/internal/backport/go/doc/testdata/bugpara.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bugpara - -// BUG(rsc): Sometimes bugs have multiple paragraphs. -// -// Like this one. diff --git a/internal/backport/go/doc/testdata/c.0.golden b/internal/backport/go/doc/testdata/c.0.golden deleted file mode 100644 index e21959b195..0000000000 --- a/internal/backport/go/doc/testdata/c.0.golden +++ /dev/null @@ -1,48 +0,0 @@ -// -PACKAGE c - -IMPORTPATH - testdata/c - -IMPORTS - a - -FILENAMES - testdata/c.go - -TYPES - // A (should see this) - type A struct{} - - // B (should see this) - type B struct{} - - // C (should see this) - type C struct{} - - // D (should see this) - type D struct{} - - // E1 (should see this) - type E1 struct{} - - // E (should see this for E2 and E3) - type E2 struct{} - - // E (should see this for E2 and E3) - type E3 struct{} - - // E4 (should see this) - type E4 struct{} - - // - type T1 struct{} - - // - func (t1 *T1) M() - - // T2 must not show methods of local T1 - type T2 struct { - a.T1 // not the same as locally declared T1 - } - diff --git a/internal/backport/go/doc/testdata/c.1.golden b/internal/backport/go/doc/testdata/c.1.golden deleted file mode 100644 index e21959b195..0000000000 --- a/internal/backport/go/doc/testdata/c.1.golden +++ /dev/null @@ -1,48 +0,0 @@ -// -PACKAGE c - -IMPORTPATH - testdata/c - -IMPORTS - a - -FILENAMES - testdata/c.go - -TYPES - // A (should see this) - type A struct{} - - // B (should see this) - type B struct{} - - // C (should see this) - type C struct{} - - // D (should see this) - type D struct{} - - // E1 (should see this) - type E1 struct{} - - // E (should see this for E2 and E3) - type E2 struct{} - - // E (should see this for E2 and E3) - type E3 struct{} - - // E4 (should see this) - type E4 struct{} - - // - type T1 struct{} - - // - func (t1 *T1) M() - - // T2 must not show methods of local T1 - type T2 struct { - a.T1 // not the same as locally declared T1 - } - diff --git a/internal/backport/go/doc/testdata/c.2.golden b/internal/backport/go/doc/testdata/c.2.golden deleted file mode 100644 index e21959b195..0000000000 --- a/internal/backport/go/doc/testdata/c.2.golden +++ /dev/null @@ -1,48 +0,0 @@ -// -PACKAGE c - -IMPORTPATH - testdata/c - -IMPORTS - a - -FILENAMES - testdata/c.go - -TYPES - // A (should see this) - type A struct{} - - // B (should see this) - type B struct{} - - // C (should see this) - type C struct{} - - // D (should see this) - type D struct{} - - // E1 (should see this) - type E1 struct{} - - // E (should see this for E2 and E3) - type E2 struct{} - - // E (should see this for E2 and E3) - type E3 struct{} - - // E4 (should see this) - type E4 struct{} - - // - type T1 struct{} - - // - func (t1 *T1) M() - - // T2 must not show methods of local T1 - type T2 struct { - a.T1 // not the same as locally declared T1 - } - diff --git a/internal/backport/go/doc/testdata/c.go b/internal/backport/go/doc/testdata/c.go deleted file mode 100644 index e0f39196de..0000000000 --- a/internal/backport/go/doc/testdata/c.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package c - -import "a" - -// ---------------------------------------------------------------------------- -// Test that empty declarations don't cause problems - -const () - -type () - -var () - -// ---------------------------------------------------------------------------- -// Test that types with documentation on both, the Decl and the Spec node -// are handled correctly. - -// A (should see this) -type A struct{} - -// B (should see this) -type ( - B struct{} -) - -type ( - // C (should see this) - C struct{} -) - -// D (should not see this) -type ( - // D (should see this) - D struct{} -) - -// E (should see this for E2 and E3) -type ( - // E1 (should see this) - E1 struct{} - E2 struct{} - E3 struct{} - // E4 (should see this) - E4 struct{} -) - -// ---------------------------------------------------------------------------- -// Test that local and imported types are different when -// handling anonymous fields. - -type T1 struct{} - -func (t1 *T1) M() {} - -// T2 must not show methods of local T1 -type T2 struct { - a.T1 // not the same as locally declared T1 -} diff --git a/internal/backport/go/doc/testdata/d.0.golden b/internal/backport/go/doc/testdata/d.0.golden deleted file mode 100644 index c005199533..0000000000 --- a/internal/backport/go/doc/testdata/d.0.golden +++ /dev/null @@ -1,104 +0,0 @@ -// -PACKAGE d - -IMPORTPATH - testdata/d - -FILENAMES - testdata/d1.go - testdata/d2.go - -CONSTANTS - // CBx constants should appear before CAx constants. - const ( - CB2 = iota // before CB1 - CB1 // before CB0 - CB0 // at end - ) - - // CAx constants should appear after CBx constants. - const ( - CA2 = iota // before CA1 - CA1 // before CA0 - CA0 // at end - ) - - // C0 should be first. - const C0 = 0 - - // C1 should be second. - const C1 = 1 - - // C2 should be third. - const C2 = 2 - - // - const ( - // Single const declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Cungrouped = 0 - ) - - -VARIABLES - // VBx variables should appear before VAx variables. - var ( - VB2 int // before VB1 - VB1 int // before VB0 - VB0 int // at end - ) - - // VAx variables should appear after VBx variables. - var ( - VA2 int // before VA1 - VA1 int // before VA0 - VA0 int // at end - ) - - // V0 should be first. - var V0 uintptr - - // V1 should be second. - var V1 uint - - // V2 should be third. - var V2 int - - // - var ( - // Single var declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Vungrouped = 0 - ) - - -FUNCTIONS - // F0 should be first. - func F0() - - // F1 should be second. - func F1() - - // F2 should be third. - func F2() - - -TYPES - // T0 should be first. - type T0 struct{} - - // T1 should be second. - type T1 struct{} - - // T2 should be third. - type T2 struct{} - - // TG0 should be first. - type TG0 struct{} - - // TG1 should be second. - type TG1 struct{} - - // TG2 should be third. - type TG2 struct{} - diff --git a/internal/backport/go/doc/testdata/d.1.golden b/internal/backport/go/doc/testdata/d.1.golden deleted file mode 100644 index c005199533..0000000000 --- a/internal/backport/go/doc/testdata/d.1.golden +++ /dev/null @@ -1,104 +0,0 @@ -// -PACKAGE d - -IMPORTPATH - testdata/d - -FILENAMES - testdata/d1.go - testdata/d2.go - -CONSTANTS - // CBx constants should appear before CAx constants. - const ( - CB2 = iota // before CB1 - CB1 // before CB0 - CB0 // at end - ) - - // CAx constants should appear after CBx constants. - const ( - CA2 = iota // before CA1 - CA1 // before CA0 - CA0 // at end - ) - - // C0 should be first. - const C0 = 0 - - // C1 should be second. - const C1 = 1 - - // C2 should be third. - const C2 = 2 - - // - const ( - // Single const declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Cungrouped = 0 - ) - - -VARIABLES - // VBx variables should appear before VAx variables. - var ( - VB2 int // before VB1 - VB1 int // before VB0 - VB0 int // at end - ) - - // VAx variables should appear after VBx variables. - var ( - VA2 int // before VA1 - VA1 int // before VA0 - VA0 int // at end - ) - - // V0 should be first. - var V0 uintptr - - // V1 should be second. - var V1 uint - - // V2 should be third. - var V2 int - - // - var ( - // Single var declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Vungrouped = 0 - ) - - -FUNCTIONS - // F0 should be first. - func F0() - - // F1 should be second. - func F1() - - // F2 should be third. - func F2() - - -TYPES - // T0 should be first. - type T0 struct{} - - // T1 should be second. - type T1 struct{} - - // T2 should be third. - type T2 struct{} - - // TG0 should be first. - type TG0 struct{} - - // TG1 should be second. - type TG1 struct{} - - // TG2 should be third. - type TG2 struct{} - diff --git a/internal/backport/go/doc/testdata/d.2.golden b/internal/backport/go/doc/testdata/d.2.golden deleted file mode 100644 index c005199533..0000000000 --- a/internal/backport/go/doc/testdata/d.2.golden +++ /dev/null @@ -1,104 +0,0 @@ -// -PACKAGE d - -IMPORTPATH - testdata/d - -FILENAMES - testdata/d1.go - testdata/d2.go - -CONSTANTS - // CBx constants should appear before CAx constants. - const ( - CB2 = iota // before CB1 - CB1 // before CB0 - CB0 // at end - ) - - // CAx constants should appear after CBx constants. - const ( - CA2 = iota // before CA1 - CA1 // before CA0 - CA0 // at end - ) - - // C0 should be first. - const C0 = 0 - - // C1 should be second. - const C1 = 1 - - // C2 should be third. - const C2 = 2 - - // - const ( - // Single const declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Cungrouped = 0 - ) - - -VARIABLES - // VBx variables should appear before VAx variables. - var ( - VB2 int // before VB1 - VB1 int // before VB0 - VB0 int // at end - ) - - // VAx variables should appear after VBx variables. - var ( - VA2 int // before VA1 - VA1 int // before VA0 - VA0 int // at end - ) - - // V0 should be first. - var V0 uintptr - - // V1 should be second. - var V1 uint - - // V2 should be third. - var V2 int - - // - var ( - // Single var declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Vungrouped = 0 - ) - - -FUNCTIONS - // F0 should be first. - func F0() - - // F1 should be second. - func F1() - - // F2 should be third. - func F2() - - -TYPES - // T0 should be first. - type T0 struct{} - - // T1 should be second. - type T1 struct{} - - // T2 should be third. - type T2 struct{} - - // TG0 should be first. - type TG0 struct{} - - // TG1 should be second. - type TG1 struct{} - - // TG2 should be third. - type TG2 struct{} - diff --git a/internal/backport/go/doc/testdata/d1.go b/internal/backport/go/doc/testdata/d1.go deleted file mode 100644 index ebd6941958..0000000000 --- a/internal/backport/go/doc/testdata/d1.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test cases for sort order of declarations. - -package d - -// C2 should be third. -const C2 = 2 - -// V2 should be third. -var V2 int - -// CBx constants should appear before CAx constants. -const ( - CB2 = iota // before CB1 - CB1 // before CB0 - CB0 // at end -) - -// VBx variables should appear before VAx variables. -var ( - VB2 int // before VB1 - VB1 int // before VB0 - VB0 int // at end -) - -const ( - // Single const declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Cungrouped = 0 -) - -var ( - // Single var declarations inside ()'s are considered ungrouped - // and show up in sorted order. - Vungrouped = 0 -) - -// T2 should be third. -type T2 struct{} - -// Grouped types are sorted nevertheless. -type ( - // TG2 should be third. - TG2 struct{} - - // TG1 should be second. - TG1 struct{} - - // TG0 should be first. - TG0 struct{} -) - -// F2 should be third. -func F2() {} diff --git a/internal/backport/go/doc/testdata/d2.go b/internal/backport/go/doc/testdata/d2.go deleted file mode 100644 index 2f56f4fa4c..0000000000 --- a/internal/backport/go/doc/testdata/d2.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test cases for sort order of declarations. - -package d - -// C1 should be second. -const C1 = 1 - -// C0 should be first. -const C0 = 0 - -// V1 should be second. -var V1 uint - -// V0 should be first. -var V0 uintptr - -// CAx constants should appear after CBx constants. -const ( - CA2 = iota // before CA1 - CA1 // before CA0 - CA0 // at end -) - -// VAx variables should appear after VBx variables. -var ( - VA2 int // before VA1 - VA1 int // before VA0 - VA0 int // at end -) - -// T1 should be second. -type T1 struct{} - -// T0 should be first. -type T0 struct{} - -// F1 should be second. -func F1() {} - -// F0 should be first. -func F0() {} diff --git a/internal/backport/go/doc/testdata/e.0.golden b/internal/backport/go/doc/testdata/e.0.golden deleted file mode 100644 index 6987e5867c..0000000000 --- a/internal/backport/go/doc/testdata/e.0.golden +++ /dev/null @@ -1,109 +0,0 @@ -// The package e is a go/doc test for embedded methods. -PACKAGE e - -IMPORTPATH - testdata/e - -FILENAMES - testdata/e.go - -TYPES - // T1 has no embedded (level 1) M method due to conflict. - type T1 struct { - // contains filtered or unexported fields - } - - // T2 has only M as top-level method. - type T2 struct { - // contains filtered or unexported fields - } - - // T2.M should appear as method of T2. - func (T2) M() - - // T3 has only M as top-level method. - type T3 struct { - // contains filtered or unexported fields - } - - // T3.M should appear as method of T3. - func (T3) M() - - // - type T4 struct{} - - // T4.M should appear as method of T5 only if AllMethods is set. - func (*T4) M() - - // - type T5 struct { - T4 - } - - // - type U1 struct { - *U1 - } - - // U1.M should appear as method of U1. - func (*U1) M() - - // - type U2 struct { - *U3 - } - - // U2.M should appear as method of U2 and as method of U3 only if ... - func (*U2) M() - - // - type U3 struct { - *U2 - } - - // U3.N should appear as method of U3 and as method of U2 only if ... - func (*U3) N() - - // - type U4 struct { - // contains filtered or unexported fields - } - - // U4.M should appear as method of U4. - func (*U4) M() - - // - type V1 struct { - *V2 - *V5 - } - - // - type V2 struct { - *V3 - } - - // - type V3 struct { - *V4 - } - - // - type V4 struct { - *V5 - } - - // V4.M should appear as method of V2 and V3 if AllMethods is set. - func (*V4) M() - - // - type V5 struct { - *V6 - } - - // - type V6 struct{} - - // V6.M should appear as method of V1 and V5 if AllMethods is set. - func (*V6) M() - diff --git a/internal/backport/go/doc/testdata/e.1.golden b/internal/backport/go/doc/testdata/e.1.golden deleted file mode 100644 index cbe22e0bf6..0000000000 --- a/internal/backport/go/doc/testdata/e.1.golden +++ /dev/null @@ -1,144 +0,0 @@ -// The package e is a go/doc test for embedded methods. -PACKAGE e - -IMPORTPATH - testdata/e - -FILENAMES - testdata/e.go - -TYPES - // T1 has no embedded (level 1) M method due to conflict. - type T1 struct { - t1 - t2 - } - - // T2 has only M as top-level method. - type T2 struct { - t1 - } - - // T2.M should appear as method of T2. - func (T2) M() - - // T3 has only M as top-level method. - type T3 struct { - t1e - t2e - } - - // T3.M should appear as method of T3. - func (T3) M() - - // - type T4 struct{} - - // T4.M should appear as method of T5 only if AllMethods is set. - func (*T4) M() - - // - type T5 struct { - T4 - } - - // - type U1 struct { - *U1 - } - - // U1.M should appear as method of U1. - func (*U1) M() - - // - type U2 struct { - *U3 - } - - // U2.M should appear as method of U2 and as method of U3 only if ... - func (*U2) M() - - // - type U3 struct { - *U2 - } - - // U3.N should appear as method of U3 and as method of U2 only if ... - func (*U3) N() - - // - type U4 struct { - *u5 - } - - // U4.M should appear as method of U4. - func (*U4) M() - - // - type V1 struct { - *V2 - *V5 - } - - // - type V2 struct { - *V3 - } - - // - type V3 struct { - *V4 - } - - // - type V4 struct { - *V5 - } - - // V4.M should appear as method of V2 and V3 if AllMethods is set. - func (*V4) M() - - // - type V5 struct { - *V6 - } - - // - type V6 struct{} - - // V6.M should appear as method of V1 and V5 if AllMethods is set. - func (*V6) M() - - // - type t1 struct{} - - // t1.M should not appear as method in a Tx type. - func (t1) M() - - // - type t1e struct { - t1 - } - - // t1.M should not appear as method in a Tx type. - func (t1e) M() - - // - type t2 struct{} - - // t2.M should not appear as method in a Tx type. - func (t2) M() - - // - type t2e struct { - t2 - } - - // t2.M should not appear as method in a Tx type. - func (t2e) M() - - // - type u5 struct { - *U4 - } - diff --git a/internal/backport/go/doc/testdata/e.2.golden b/internal/backport/go/doc/testdata/e.2.golden deleted file mode 100644 index e7b05e80fa..0000000000 --- a/internal/backport/go/doc/testdata/e.2.golden +++ /dev/null @@ -1,130 +0,0 @@ -// The package e is a go/doc test for embedded methods. -PACKAGE e - -IMPORTPATH - testdata/e - -FILENAMES - testdata/e.go - -TYPES - // T1 has no embedded (level 1) M method due to conflict. - type T1 struct { - // contains filtered or unexported fields - } - - // T2 has only M as top-level method. - type T2 struct { - // contains filtered or unexported fields - } - - // T2.M should appear as method of T2. - func (T2) M() - - // T3 has only M as top-level method. - type T3 struct { - // contains filtered or unexported fields - } - - // T3.M should appear as method of T3. - func (T3) M() - - // - type T4 struct{} - - // T4.M should appear as method of T5 only if AllMethods is set. - func (*T4) M() - - // - type T5 struct { - T4 - } - - // T4.M should appear as method of T5 only if AllMethods is set. - func (*T5) M() - - // - type U1 struct { - *U1 - } - - // U1.M should appear as method of U1. - func (*U1) M() - - // - type U2 struct { - *U3 - } - - // U2.M should appear as method of U2 and as method of U3 only if ... - func (*U2) M() - - // U3.N should appear as method of U3 and as method of U2 only if ... - func (U2) N() - - // - type U3 struct { - *U2 - } - - // U2.M should appear as method of U2 and as method of U3 only if ... - func (U3) M() - - // U3.N should appear as method of U3 and as method of U2 only if ... - func (*U3) N() - - // - type U4 struct { - // contains filtered or unexported fields - } - - // U4.M should appear as method of U4. - func (*U4) M() - - // - type V1 struct { - *V2 - *V5 - } - - // V6.M should appear as method of V1 and V5 if AllMethods is set. - func (V1) M() - - // - type V2 struct { - *V3 - } - - // V4.M should appear as method of V2 and V3 if AllMethods is set. - func (V2) M() - - // - type V3 struct { - *V4 - } - - // V4.M should appear as method of V2 and V3 if AllMethods is set. - func (V3) M() - - // - type V4 struct { - *V5 - } - - // V4.M should appear as method of V2 and V3 if AllMethods is set. - func (*V4) M() - - // - type V5 struct { - *V6 - } - - // V6.M should appear as method of V1 and V5 if AllMethods is set. - func (V5) M() - - // - type V6 struct{} - - // V6.M should appear as method of V1 and V5 if AllMethods is set. - func (*V6) M() - diff --git a/internal/backport/go/doc/testdata/e.go b/internal/backport/go/doc/testdata/e.go deleted file mode 100644 index ec432e3e52..0000000000 --- a/internal/backport/go/doc/testdata/e.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The package e is a go/doc test for embedded methods. -package e - -// ---------------------------------------------------------------------------- -// Conflicting methods M must not show up. - -type t1 struct{} - -// t1.M should not appear as method in a Tx type. -func (t1) M() {} - -type t2 struct{} - -// t2.M should not appear as method in a Tx type. -func (t2) M() {} - -// T1 has no embedded (level 1) M method due to conflict. -type T1 struct { - t1 - t2 -} - -// ---------------------------------------------------------------------------- -// Higher-level method M wins over lower-level method M. - -// T2 has only M as top-level method. -type T2 struct { - t1 -} - -// T2.M should appear as method of T2. -func (T2) M() {} - -// ---------------------------------------------------------------------------- -// Higher-level method M wins over lower-level conflicting methods M. - -type t1e struct { - t1 -} - -type t2e struct { - t2 -} - -// T3 has only M as top-level method. -type T3 struct { - t1e - t2e -} - -// T3.M should appear as method of T3. -func (T3) M() {} - -// ---------------------------------------------------------------------------- -// Don't show conflicting methods M embedded via an exported and non-exported -// type. - -// T1 has no embedded (level 1) M method due to conflict. -type T4 struct { - t2 - T2 -} - -// ---------------------------------------------------------------------------- -// Don't show embedded methods of exported anonymous fields unless AllMethods -// is set. - -type T4 struct{} - -// T4.M should appear as method of T5 only if AllMethods is set. -func (*T4) M() {} - -type T5 struct { - T4 -} - -// ---------------------------------------------------------------------------- -// Recursive type declarations must not lead to endless recursion. - -type U1 struct { - *U1 -} - -// U1.M should appear as method of U1. -func (*U1) M() {} - -type U2 struct { - *U3 -} - -// U2.M should appear as method of U2 and as method of U3 only if AllMethods is set. -func (*U2) M() {} - -type U3 struct { - *U2 -} - -// U3.N should appear as method of U3 and as method of U2 only if AllMethods is set. -func (*U3) N() {} - -type U4 struct { - *u5 -} - -// U4.M should appear as method of U4. -func (*U4) M() {} - -type u5 struct { - *U4 -} - -// ---------------------------------------------------------------------------- -// A higher-level embedded type (and its methods) wins over the same type (and -// its methods) embedded at a lower level. - -type V1 struct { - *V2 - *V5 -} - -type V2 struct { - *V3 -} - -type V3 struct { - *V4 -} - -type V4 struct { - *V5 -} - -type V5 struct { - *V6 -} - -type V6 struct{} - -// V4.M should appear as method of V2 and V3 if AllMethods is set. -func (*V4) M() {} - -// V6.M should appear as method of V1 and V5 if AllMethods is set. -func (*V6) M() {} diff --git a/internal/backport/go/doc/testdata/error1.0.golden b/internal/backport/go/doc/testdata/error1.0.golden deleted file mode 100644 index 6c6fe5d49b..0000000000 --- a/internal/backport/go/doc/testdata/error1.0.golden +++ /dev/null @@ -1,30 +0,0 @@ -// -PACKAGE error1 - -IMPORTPATH - testdata/error1 - -FILENAMES - testdata/error1.go - -TYPES - // - type I0 interface { - // When embedded, the predeclared error interface - // must remain visible in interface types. - error - } - - // - type S0 struct { - // contains filtered or unexported fields - } - - // - type T0 struct { - ExportedField interface { - // error should be visible - error - } - } - diff --git a/internal/backport/go/doc/testdata/error1.1.golden b/internal/backport/go/doc/testdata/error1.1.golden deleted file mode 100644 index a8dc2e71dc..0000000000 --- a/internal/backport/go/doc/testdata/error1.1.golden +++ /dev/null @@ -1,32 +0,0 @@ -// -PACKAGE error1 - -IMPORTPATH - testdata/error1 - -FILENAMES - testdata/error1.go - -TYPES - // - type I0 interface { - // When embedded, the predeclared error interface - // must remain visible in interface types. - error - } - - // - type S0 struct { - // In struct types, an embedded error must only be visible - // if AllDecls is set. - error - } - - // - type T0 struct { - ExportedField interface { - // error should be visible - error - } - } - diff --git a/internal/backport/go/doc/testdata/error1.2.golden b/internal/backport/go/doc/testdata/error1.2.golden deleted file mode 100644 index 6c6fe5d49b..0000000000 --- a/internal/backport/go/doc/testdata/error1.2.golden +++ /dev/null @@ -1,30 +0,0 @@ -// -PACKAGE error1 - -IMPORTPATH - testdata/error1 - -FILENAMES - testdata/error1.go - -TYPES - // - type I0 interface { - // When embedded, the predeclared error interface - // must remain visible in interface types. - error - } - - // - type S0 struct { - // contains filtered or unexported fields - } - - // - type T0 struct { - ExportedField interface { - // error should be visible - error - } - } - diff --git a/internal/backport/go/doc/testdata/error1.go b/internal/backport/go/doc/testdata/error1.go deleted file mode 100644 index 3c777a7800..0000000000 --- a/internal/backport/go/doc/testdata/error1.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package error1 - -type I0 interface { - // When embedded, the predeclared error interface - // must remain visible in interface types. - error -} - -type T0 struct { - ExportedField interface { - // error should be visible - error - } -} - -type S0 struct { - // In struct types, an embedded error must only be visible - // if AllDecls is set. - error -} diff --git a/internal/backport/go/doc/testdata/error2.0.golden b/internal/backport/go/doc/testdata/error2.0.golden deleted file mode 100644 index dedfe412a0..0000000000 --- a/internal/backport/go/doc/testdata/error2.0.golden +++ /dev/null @@ -1,27 +0,0 @@ -// -PACKAGE error2 - -IMPORTPATH - testdata/error2 - -FILENAMES - testdata/error2.go - -TYPES - // - type I0 interface { - // contains filtered or unexported methods - } - - // - type S0 struct { - // contains filtered or unexported fields - } - - // - type T0 struct { - ExportedField interface { - // contains filtered or unexported methods - } - } - diff --git a/internal/backport/go/doc/testdata/error2.1.golden b/internal/backport/go/doc/testdata/error2.1.golden deleted file mode 100644 index dbcc1b03e7..0000000000 --- a/internal/backport/go/doc/testdata/error2.1.golden +++ /dev/null @@ -1,37 +0,0 @@ -// -PACKAGE error2 - -IMPORTPATH - testdata/error2 - -FILENAMES - testdata/error2.go - -TYPES - // - type I0 interface { - // When embedded, the locally-declared error interface - // is only visible if all declarations are shown. - error - } - - // - type S0 struct { - // In struct types, an embedded error must only be visible - // if AllDecls is set. - error - } - - // - type T0 struct { - ExportedField interface { - // error should not be visible - error - } - } - - // This error declaration shadows the predeclared error type. - type error interface { - Error() string - } - diff --git a/internal/backport/go/doc/testdata/error2.2.golden b/internal/backport/go/doc/testdata/error2.2.golden deleted file mode 100644 index dedfe412a0..0000000000 --- a/internal/backport/go/doc/testdata/error2.2.golden +++ /dev/null @@ -1,27 +0,0 @@ -// -PACKAGE error2 - -IMPORTPATH - testdata/error2 - -FILENAMES - testdata/error2.go - -TYPES - // - type I0 interface { - // contains filtered or unexported methods - } - - // - type S0 struct { - // contains filtered or unexported fields - } - - // - type T0 struct { - ExportedField interface { - // contains filtered or unexported methods - } - } - diff --git a/internal/backport/go/doc/testdata/error2.go b/internal/backport/go/doc/testdata/error2.go deleted file mode 100644 index 6ee96c2450..0000000000 --- a/internal/backport/go/doc/testdata/error2.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package error2 - -type I0 interface { - // When embedded, the locally-declared error interface - // is only visible if all declarations are shown. - error -} - -type T0 struct { - ExportedField interface { - // error should not be visible - error - } -} - -type S0 struct { - // In struct types, an embedded error must only be visible - // if AllDecls is set. - error -} - -// This error declaration shadows the predeclared error type. -type error interface { - Error() string -} diff --git a/internal/backport/go/doc/testdata/example.go b/internal/backport/go/doc/testdata/example.go deleted file mode 100644 index fdeda137e7..0000000000 --- a/internal/backport/go/doc/testdata/example.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package testing - -import ( - "bytes" - "fmt" - "io" - "os" - "strings" - "time" -) - -type InternalExample struct { - Name string - F func() - Output string -} - -func RunExamples(examples []InternalExample) (ok bool) { - ok = true - - var eg InternalExample - - stdout, stderr := os.Stdout, os.Stderr - defer func() { - os.Stdout, os.Stderr = stdout, stderr - if e := recover(); e != nil { - fmt.Printf("--- FAIL: %s\npanic: %v\n", eg.Name, e) - os.Exit(1) - } - }() - - for _, eg = range examples { - if *chatty { - fmt.Printf("=== RUN: %s\n", eg.Name) - } - - // capture stdout and stderr - r, w, err := os.Pipe() - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - os.Stdout, os.Stderr = w, w - outC := make(chan string) - go func() { - buf := new(bytes.Buffer) - _, err := io.Copy(buf, r) - if err != nil { - fmt.Fprintf(stderr, "testing: copying pipe: %v\n", err) - os.Exit(1) - } - outC <- buf.String() - }() - - // run example - t0 := time.Now() - eg.F() - dt := time.Now().Sub(t0) - - // close pipe, restore stdout/stderr, get output - w.Close() - os.Stdout, os.Stderr = stdout, stderr - out := <-outC - - // report any errors - tstr := fmt.Sprintf("(%.2f seconds)", dt.Seconds()) - if g, e := strings.TrimSpace(out), strings.TrimSpace(eg.Output); g != e { - fmt.Printf("--- FAIL: %s %s\ngot:\n%s\nwant:\n%s\n", - eg.Name, tstr, g, e) - ok = false - } else if *chatty { - fmt.Printf("--- PASS: %s %s\n", eg.Name, tstr) - } - } - - return -} diff --git a/internal/backport/go/doc/testdata/examples/README.md b/internal/backport/go/doc/testdata/examples/README.md deleted file mode 100644 index a1c18e88ec..0000000000 --- a/internal/backport/go/doc/testdata/examples/README.md +++ /dev/null @@ -1,12 +0,0 @@ -These files are processed by example_test.go:TestExamples. - -A .golden file is a txtar file with two sections for each example that should be -created by doc.Examples from the corresponding .go file. - -One section, named EXAMPLE_NAME.Output, contains the example's output, -the value of the field Example.Output. - -The other, named EXAMPLE_NAME.Play, contains the formatted code for a playable -version of the example, the value of the field Example.Play. - -If a section is missing, it is treated as being empty. diff --git a/internal/backport/go/doc/testdata/examples/empty.go b/internal/backport/go/doc/testdata/examples/empty.go deleted file mode 100644 index 0b10420f42..0000000000 --- a/internal/backport/go/doc/testdata/examples/empty.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p - -func Example() {} -func Example_a() diff --git a/internal/backport/go/doc/testdata/examples/empty.golden b/internal/backport/go/doc/testdata/examples/empty.golden deleted file mode 100644 index 2aafd20435..0000000000 --- a/internal/backport/go/doc/testdata/examples/empty.golden +++ /dev/null @@ -1,6 +0,0 @@ --- .Play -- -package main - -func main() {} -func main() - diff --git a/internal/backport/go/doc/testdata/examples/generic_constraints.go b/internal/backport/go/doc/testdata/examples/generic_constraints.go deleted file mode 100644 index ea5d2b37f4..0000000000 --- a/internal/backport/go/doc/testdata/examples/generic_constraints.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p_test - -import ( - "fmt" - "time" -) - -type C1 interface { - string | int -} - -type C2 interface { - M(time.Time) -} - -type G[T C1] int - -func g[T C2](x T) {} - -type Tm int - -func (Tm) M(time.Time) {} - -type Foo int - -func Example() { - fmt.Println("hello") -} - -func ExampleGeneric() { - var x G[string] - g(Tm(3)) - fmt.Println(x) -} diff --git a/internal/backport/go/doc/testdata/examples/generic_constraints.golden b/internal/backport/go/doc/testdata/examples/generic_constraints.golden deleted file mode 100644 index 6c7b0eda9f..0000000000 --- a/internal/backport/go/doc/testdata/examples/generic_constraints.golden +++ /dev/null @@ -1,39 +0,0 @@ --- .Play -- -package main - -import ( - "fmt" -) - -func main() { - fmt.Println("hello") -} --- Generic.Play -- -package main - -import ( - "fmt" - "time" -) - -type C1 interface { - string | int -} - -type C2 interface { - M(time.Time) -} - -type G[T C1] int - -func g[T C2](x T) {} - -type Tm int - -func (Tm) M(time.Time) {} - -func main() { - var x G[string] - g(Tm(3)) - fmt.Println(x) -} diff --git a/internal/backport/go/doc/testdata/examples/import_groups.go b/internal/backport/go/doc/testdata/examples/import_groups.go deleted file mode 100644 index 05f21caaaa..0000000000 --- a/internal/backport/go/doc/testdata/examples/import_groups.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -import ( - "fmt" - "time" - - "golang.org/x/time/rate" -) - -func Example() { - fmt.Println("Hello, world!") - // Output: Hello, world! -} - -func ExampleLimiter() { - // Uses fmt, time and rate. - l := rate.NewLimiter(rate.Every(time.Second), 1) - fmt.Println(l) -} diff --git a/internal/backport/go/doc/testdata/examples/import_groups.golden b/internal/backport/go/doc/testdata/examples/import_groups.golden deleted file mode 100644 index efe2cc1df5..0000000000 --- a/internal/backport/go/doc/testdata/examples/import_groups.golden +++ /dev/null @@ -1,27 +0,0 @@ --- .Play -- -package main - -import ( - "fmt" -) - -func main() { - fmt.Println("Hello, world!") -} --- .Output -- -Hello, world! --- Limiter.Play -- -package main - -import ( - "fmt" - "time" - - "golang.org/x/time/rate" -) - -func main() { - // Uses fmt, time and rate. - l := rate.NewLimiter(rate.Every(time.Second), 1) - fmt.Println(l) -} diff --git a/internal/backport/go/doc/testdata/examples/import_groups_named.go b/internal/backport/go/doc/testdata/examples/import_groups_named.go deleted file mode 100644 index 377022b22a..0000000000 --- a/internal/backport/go/doc/testdata/examples/import_groups_named.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -import ( - "fmt" - tm "time" - - r "golang.org/x/time/rate" -) - -func Example() { - fmt.Println("Hello, world!") - // Output: Hello, world! -} - -func ExampleLimiter() { - // Uses fmt, time and rate. - l := r.NewLimiter(r.Every(tm.Second), 1) - fmt.Println(l) -} diff --git a/internal/backport/go/doc/testdata/examples/import_groups_named.golden b/internal/backport/go/doc/testdata/examples/import_groups_named.golden deleted file mode 100644 index 9baf373cd8..0000000000 --- a/internal/backport/go/doc/testdata/examples/import_groups_named.golden +++ /dev/null @@ -1,27 +0,0 @@ --- .Play -- -package main - -import ( - "fmt" -) - -func main() { - fmt.Println("Hello, world!") -} --- .Output -- -Hello, world! --- Limiter.Play -- -package main - -import ( - "fmt" - tm "time" - - r "golang.org/x/time/rate" -) - -func main() { - // Uses fmt, time and rate. - l := r.NewLimiter(r.Every(tm.Second), 1) - fmt.Println(l) -} diff --git a/internal/backport/go/doc/testdata/examples/inspect_signature.go b/internal/backport/go/doc/testdata/examples/inspect_signature.go deleted file mode 100644 index c4a36e758d..0000000000 --- a/internal/backport/go/doc/testdata/examples/inspect_signature.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -import ( - "bytes" - "io" -) - -func getReader() io.Reader { return nil } - -func do(b bytes.Reader) {} - -func Example() { - getReader() - do() - // Output: -} - -func ExampleIgnored() { -} diff --git a/internal/backport/go/doc/testdata/examples/inspect_signature.golden b/internal/backport/go/doc/testdata/examples/inspect_signature.golden deleted file mode 100644 index c0d9b2ecc8..0000000000 --- a/internal/backport/go/doc/testdata/examples/inspect_signature.golden +++ /dev/null @@ -1,24 +0,0 @@ --- .Play -- -package main - -import ( - "bytes" - "io" -) - -func getReader() io.Reader { return nil } - -func do(b bytes.Reader) {} - -func main() { - getReader() - do() -} --- Ignored.Play -- -package main - -import () - -func main() { -} - diff --git a/internal/backport/go/doc/testdata/examples/iota.go b/internal/backport/go/doc/testdata/examples/iota.go deleted file mode 100644 index c878b7708e..0000000000 --- a/internal/backport/go/doc/testdata/examples/iota.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -const ( - a = iota - b -) - -const ( - c = 3 - d = 4 -) - -const ( - e = iota - f -) - -// The example refers to only one of the constants in the iota group, but we -// must keep all of them because of the iota. The second group of constants can -// be trimmed. The third has an iota, but is unused, so it can be eliminated. - -func Example() { - _ = b - _ = d -} - -// Need two examples to hit the playExample function. - -func Example2() { -} diff --git a/internal/backport/go/doc/testdata/examples/iota.golden b/internal/backport/go/doc/testdata/examples/iota.golden deleted file mode 100644 index 748770260b..0000000000 --- a/internal/backport/go/doc/testdata/examples/iota.golden +++ /dev/null @@ -1,23 +0,0 @@ --- .Play -- -package main - -import () - -const ( - a = iota - b -) - -const d = 4 - -func main() { - _ = b - _ = d -} --- 2.Play -- -package main - -import () - -func main() { -} diff --git a/internal/backport/go/doc/testdata/examples/issue43658.go b/internal/backport/go/doc/testdata/examples/issue43658.go deleted file mode 100644 index 385223acf3..0000000000 --- a/internal/backport/go/doc/testdata/examples/issue43658.go +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright ©2016 The Gonum Authors. All rights reserved. -// Copyright 2021 The Go Authors. All rights reserved. -// (above line required for our license-header checker) -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package community_test - -import ( - "fmt" - "log" - "sort" - - "golang.org/x/exp/rand" - - "gonum.org/v1/gonum/graph/community" - "gonum.org/v1/gonum/graph/internal/ordered" - "gonum.org/v1/gonum/graph/simple" -) - -func ExampleProfile_simple() { - // Profile calls Modularize which implements the Louvain modularization algorithm. - // Since this is a randomized algorithm we use a defined random source to ensure - // consistency between test runs. In practice, results will not differ greatly - // between runs with different PRNG seeds. - src := rand.NewSource(1) - - // Create dumbell graph: - // - // 0 4 - // |\ /| - // | 2 - 3 | - // |/ \| - // 1 5 - // - g := simple.NewUndirectedGraph() - for u, e := range smallDumbell { - for v := range e { - g.SetEdge(simple.Edge{F: simple.Node(u), T: simple.Node(v)}) - } - } - - // Get the profile of internal node weight for resolutions - // between 0.1 and 10 using logarithmic bisection. - p, err := community.Profile( - community.ModularScore(g, community.Weight, 10, src), - true, 1e-3, 0.1, 10, - ) - if err != nil { - log.Fatal(err) - } - - // Print out each step with communities ordered. - for _, d := range p { - comm := d.Communities() - for _, c := range comm { - sort.Sort(ordered.ByID(c)) - } - sort.Sort(ordered.BySliceIDs(comm)) - fmt.Printf("Low:%.2v High:%.2v Score:%v Communities:%v Q=%.3v\n", - d.Low, d.High, d.Score, comm, community.Q(g, comm, d.Low)) - } - - // Output: - // Low:0.1 High:0.29 Score:14 Communities:[[0 1 2 3 4 5]] Q=0.9 - // Low:0.29 High:2.3 Score:12 Communities:[[0 1 2] [3 4 5]] Q=0.714 - // Low:2.3 High:3.5 Score:4 Communities:[[0 1] [2] [3] [4 5]] Q=-0.31 - // Low:3.5 High:10 Score:0 Communities:[[0] [1] [2] [3] [4] [5]] Q=-0.607 -} - -// intset is an integer set. -type intset map[int]struct{} - -func linksTo(i ...int) intset { - if len(i) == 0 { - return nil - } - s := make(intset) - for _, v := range i { - s[v] = struct{}{} - } - return s -} - -var ( - smallDumbell = []intset{ - 0: linksTo(1, 2), - 1: linksTo(2), - 2: linksTo(3), - 3: linksTo(4, 5), - 4: linksTo(5), - 5: nil, - } - - // http://www.slate.com/blogs/the_world_/2014/07/17/the_middle_east_friendship_chart.html - middleEast = struct{ friends, complicated, enemies []intset }{ - // green cells - friends: []intset{ - 0: nil, - 1: linksTo(5, 7, 9, 12), - 2: linksTo(11), - 3: linksTo(4, 5, 10), - 4: linksTo(3, 5, 10), - 5: linksTo(1, 3, 4, 8, 10, 12), - 6: nil, - 7: linksTo(1, 12), - 8: linksTo(5, 9, 11), - 9: linksTo(1, 8, 12), - 10: linksTo(3, 4, 5), - 11: linksTo(2, 8), - 12: linksTo(1, 5, 7, 9), - }, - - // yellow cells - complicated: []intset{ - 0: linksTo(2, 4), - 1: linksTo(4, 8), - 2: linksTo(0, 3, 4, 5, 8, 9), - 3: linksTo(2, 8, 11), - 4: linksTo(0, 1, 2, 8), - 5: linksTo(2), - 6: nil, - 7: linksTo(9, 11), - 8: linksTo(1, 2, 3, 4, 10, 12), - 9: linksTo(2, 7, 11), - 10: linksTo(8), - 11: linksTo(3, 7, 9, 12), - 12: linksTo(8, 11), - }, - - // red cells - enemies: []intset{ - 0: linksTo(1, 3, 5, 6, 7, 8, 9, 10, 11, 12), - 1: linksTo(0, 2, 3, 6, 10, 11), - 2: linksTo(1, 6, 7, 10, 12), - 3: linksTo(0, 1, 6, 7, 9, 12), - 4: linksTo(6, 7, 9, 11, 12), - 5: linksTo(0, 6, 7, 9, 11), - 6: linksTo(0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12), - 7: linksTo(0, 2, 3, 4, 5, 6, 8, 10), - 8: linksTo(0, 6, 7), - 9: linksTo(0, 3, 4, 5, 6, 10), - 10: linksTo(0, 1, 2, 6, 7, 9, 11, 12), - 11: linksTo(0, 1, 4, 5, 6, 10), - 12: linksTo(0, 2, 3, 4, 6, 10), - }, - } -) - -var friends, enemies *simple.WeightedUndirectedGraph - -func init() { - friends = simple.NewWeightedUndirectedGraph(0, 0) - for u, e := range middleEast.friends { - // Ensure unconnected nodes are included. - if friends.Node(int64(u)) == nil { - friends.AddNode(simple.Node(u)) - } - for v := range e { - friends.SetWeightedEdge(simple.WeightedEdge{F: simple.Node(u), T: simple.Node(v), W: 1}) - } - } - enemies = simple.NewWeightedUndirectedGraph(0, 0) - for u, e := range middleEast.enemies { - // Ensure unconnected nodes are included. - if enemies.Node(int64(u)) == nil { - enemies.AddNode(simple.Node(u)) - } - for v := range e { - enemies.SetWeightedEdge(simple.WeightedEdge{F: simple.Node(u), T: simple.Node(v), W: -1}) - } - } -} - -func ExampleProfile_multiplex() { - // Profile calls ModularizeMultiplex which implements the Louvain modularization - // algorithm. Since this is a randomized algorithm we use a defined random source - // to ensure consistency between test runs. In practice, results will not differ - // greatly between runs with different PRNG seeds. - src := rand.NewSource(1) - - // The undirected graphs, friends and enemies, are the political relationships - // in the Middle East as described in the Slate article: - // http://www.slate.com/blogs/the_world_/2014/07/17/the_middle_east_friendship_chart.html - g, err := community.NewUndirectedLayers(friends, enemies) - if err != nil { - log.Fatal(err) - } - weights := []float64{1, -1} - - // Get the profile of internal node weight for resolutions - // between 0.1 and 10 using logarithmic bisection. - p, err := community.Profile( - community.ModularMultiplexScore(g, weights, true, community.WeightMultiplex, 10, src), - true, 1e-3, 0.1, 10, - ) - if err != nil { - log.Fatal(err) - } - - // Print out each step with communities ordered. - for _, d := range p { - comm := d.Communities() - for _, c := range comm { - sort.Sort(ordered.ByID(c)) - } - sort.Sort(ordered.BySliceIDs(comm)) - fmt.Printf("Low:%.2v High:%.2v Score:%v Communities:%v Q=%.3v\n", - d.Low, d.High, d.Score, comm, community.QMultiplex(g, comm, weights, []float64{d.Low})) - } - - // Output: - // Low:0.1 High:0.72 Score:26 Communities:[[0] [1 7 9 12] [2 8 11] [3 4 5 10] [6]] Q=[24.7 1.97] - // Low:0.72 High:1.1 Score:24 Communities:[[0 6] [1 7 9 12] [2 8 11] [3 4 5 10]] Q=[16.9 14.1] - // Low:1.1 High:1.2 Score:18 Communities:[[0 2 6 11] [1 7 9 12] [3 4 5 8 10]] Q=[9.16 25.1] - // Low:1.2 High:1.6 Score:10 Communities:[[0 3 4 5 6 10] [1 7 9 12] [2 8 11]] Q=[10.5 26.7] - // Low:1.6 High:1.6 Score:8 Communities:[[0 1 6 7 9 12] [2 8 11] [3 4 5 10]] Q=[5.56 39.8] - // Low:1.6 High:1.8 Score:2 Communities:[[0 2 3 4 5 6 10] [1 7 8 9 11 12]] Q=[-1.82 48.6] - // Low:1.8 High:2.3 Score:-6 Communities:[[0 2 3 4 5 6 8 10 11] [1 7 9 12]] Q=[-5 57.5] - // Low:2.3 High:2.4 Score:-10 Communities:[[0 1 2 6 7 8 9 11 12] [3 4 5 10]] Q=[-11.2 79] - // Low:2.4 High:4.3 Score:-52 Communities:[[0 1 2 3 4 5 6 7 8 9 10 11 12]] Q=[-46.1 117] - // Low:4.3 High:10 Score:-54 Communities:[[0 1 2 3 4 6 7 8 9 10 11 12] [5]] Q=[-82 254] -} diff --git a/internal/backport/go/doc/testdata/examples/issue43658.golden b/internal/backport/go/doc/testdata/examples/issue43658.golden deleted file mode 100644 index 5200d14584..0000000000 --- a/internal/backport/go/doc/testdata/examples/issue43658.golden +++ /dev/null @@ -1,156 +0,0 @@ --- Profile_simple.Play -- -package main - -import ( - "fmt" - "log" - "sort" - - "golang.org/x/exp/rand" - - "gonum.org/v1/gonum/graph/community" - "gonum.org/v1/gonum/graph/internal/ordered" - "gonum.org/v1/gonum/graph/simple" -) - -func main() { - // Profile calls Modularize which implements the Louvain modularization algorithm. - // Since this is a randomized algorithm we use a defined random source to ensure - // consistency between test runs. In practice, results will not differ greatly - // between runs with different PRNG seeds. - src := rand.NewSource(1) - - // Create dumbell graph: - // - // 0 4 - // |\ /| - // | 2 - 3 | - // |/ \| - // 1 5 - // - g := simple.NewUndirectedGraph() - for u, e := range smallDumbell { - for v := range e { - g.SetEdge(simple.Edge{F: simple.Node(u), T: simple.Node(v)}) - } - } - - // Get the profile of internal node weight for resolutions - // between 0.1 and 10 using logarithmic bisection. - p, err := community.Profile( - community.ModularScore(g, community.Weight, 10, src), - true, 1e-3, 0.1, 10, - ) - if err != nil { - log.Fatal(err) - } - - // Print out each step with communities ordered. - for _, d := range p { - comm := d.Communities() - for _, c := range comm { - sort.Sort(ordered.ByID(c)) - } - sort.Sort(ordered.BySliceIDs(comm)) - fmt.Printf("Low:%.2v High:%.2v Score:%v Communities:%v Q=%.3v\n", - d.Low, d.High, d.Score, comm, community.Q(g, comm, d.Low)) - } - -} - -// intset is an integer set. -type intset map[int]struct{} - -func linksTo(i ...int) intset { - if len(i) == 0 { - return nil - } - s := make(intset) - for _, v := range i { - s[v] = struct{}{} - } - return s -} - -var smallDumbell = []intset{ - 0: linksTo(1, 2), - 1: linksTo(2), - 2: linksTo(3), - 3: linksTo(4, 5), - 4: linksTo(5), - 5: nil, -} - --- Profile_simple.Output -- -Low:0.1 High:0.29 Score:14 Communities:[[0 1 2 3 4 5]] Q=0.9 -Low:0.29 High:2.3 Score:12 Communities:[[0 1 2] [3 4 5]] Q=0.714 -Low:2.3 High:3.5 Score:4 Communities:[[0 1] [2] [3] [4 5]] Q=-0.31 -Low:3.5 High:10 Score:0 Communities:[[0] [1] [2] [3] [4] [5]] Q=-0.607 - --- Profile_multiplex.Play -- - -package main - -import ( - "fmt" - "log" - "sort" - - "golang.org/x/exp/rand" - - "gonum.org/v1/gonum/graph/community" - "gonum.org/v1/gonum/graph/internal/ordered" - "gonum.org/v1/gonum/graph/simple" -) - -var friends, enemies *simple.WeightedUndirectedGraph - -func main() { - // Profile calls ModularizeMultiplex which implements the Louvain modularization - // algorithm. Since this is a randomized algorithm we use a defined random source - // to ensure consistency between test runs. In practice, results will not differ - // greatly between runs with different PRNG seeds. - src := rand.NewSource(1) - - // The undirected graphs, friends and enemies, are the political relationships - // in the Middle East as described in the Slate article: - // http://www.slate.com/blogs/the_world_/2014/07/17/the_middle_east_friendship_chart.html - g, err := community.NewUndirectedLayers(friends, enemies) - if err != nil { - log.Fatal(err) - } - weights := []float64{1, -1} - - // Get the profile of internal node weight for resolutions - // between 0.1 and 10 using logarithmic bisection. - p, err := community.Profile( - community.ModularMultiplexScore(g, weights, true, community.WeightMultiplex, 10, src), - true, 1e-3, 0.1, 10, - ) - if err != nil { - log.Fatal(err) - } - - // Print out each step with communities ordered. - for _, d := range p { - comm := d.Communities() - for _, c := range comm { - sort.Sort(ordered.ByID(c)) - } - sort.Sort(ordered.BySliceIDs(comm)) - fmt.Printf("Low:%.2v High:%.2v Score:%v Communities:%v Q=%.3v\n", - d.Low, d.High, d.Score, comm, community.QMultiplex(g, comm, weights, []float64{d.Low})) - } - -} --- Profile_multiplex.Output -- -Low:0.1 High:0.72 Score:26 Communities:[[0] [1 7 9 12] [2 8 11] [3 4 5 10] [6]] Q=[24.7 1.97] -Low:0.72 High:1.1 Score:24 Communities:[[0 6] [1 7 9 12] [2 8 11] [3 4 5 10]] Q=[16.9 14.1] -Low:1.1 High:1.2 Score:18 Communities:[[0 2 6 11] [1 7 9 12] [3 4 5 8 10]] Q=[9.16 25.1] -Low:1.2 High:1.6 Score:10 Communities:[[0 3 4 5 6 10] [1 7 9 12] [2 8 11]] Q=[10.5 26.7] -Low:1.6 High:1.6 Score:8 Communities:[[0 1 6 7 9 12] [2 8 11] [3 4 5 10]] Q=[5.56 39.8] -Low:1.6 High:1.8 Score:2 Communities:[[0 2 3 4 5 6 10] [1 7 8 9 11 12]] Q=[-1.82 48.6] -Low:1.8 High:2.3 Score:-6 Communities:[[0 2 3 4 5 6 8 10 11] [1 7 9 12]] Q=[-5 57.5] -Low:2.3 High:2.4 Score:-10 Communities:[[0 1 2 6 7 8 9 11 12] [3 4 5 10]] Q=[-11.2 79] -Low:2.4 High:4.3 Score:-52 Communities:[[0 1 2 3 4 5 6 7 8 9 10 11 12]] Q=[-46.1 117] -Low:4.3 High:10 Score:-54 Communities:[[0 1 2 3 4 6 7 8 9 10 11 12] [5]] Q=[-82 254] diff --git a/internal/backport/go/doc/testdata/examples/multiple.go b/internal/backport/go/doc/testdata/examples/multiple.go deleted file mode 100644 index 27282644d8..0000000000 --- a/internal/backport/go/doc/testdata/examples/multiple.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -import ( - "flag" - "fmt" - "log" - "os/exec" - "sort" -) - -func ExampleHello() { - fmt.Println("Hello, world!") - // Output: Hello, world! -} - -func ExampleImport() { - out, err := exec.Command("date").Output() - if err != nil { - log.Fatal(err) - } - fmt.Printf("The date is %s\n", out) -} - -func ExampleKeyValue() { - v := struct { - a string - b int - }{ - a: "A", - b: 1, - } - fmt.Print(v) - // Output: a: "A", b: 1 -} - -func ExampleKeyValueImport() { - f := flag.Flag{ - Name: "play", - } - fmt.Print(f) - // Output: Name: "play" -} - -var keyValueTopDecl = struct { - a string - b int -}{ - a: "B", - b: 2, -} - -func ExampleKeyValueTopDecl() { - fmt.Print(keyValueTopDecl) - // Output: a: "B", b: 2 -} - -// Person represents a person by name and age. -type Person struct { - Name string - Age int -} - -// String returns a string representation of the Person. -func (p Person) String() string { - return fmt.Sprintf("%s: %d", p.Name, p.Age) -} - -// ByAge implements sort.Interface for []Person based on -// the Age field. -type ByAge []Person - -// Len returns the number of elements in ByAge. -func (a ByAge) Len() int { return len(a) } - -// Swap swaps the elements in ByAge. -func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age } - -// people is the array of Person -var people = []Person{ - {"Bob", 31}, - {"John", 42}, - {"Michael", 17}, - {"Jenny", 26}, -} - -func ExampleSort() { - fmt.Println(people) - sort.Sort(ByAge(people)) - fmt.Println(people) - // Output: - // [Bob: 31 John: 42 Michael: 17 Jenny: 26] - // [Michael: 17 Jenny: 26 Bob: 31 John: 42] -} diff --git a/internal/backport/go/doc/testdata/examples/multiple.golden b/internal/backport/go/doc/testdata/examples/multiple.golden deleted file mode 100644 index d2d791effa..0000000000 --- a/internal/backport/go/doc/testdata/examples/multiple.golden +++ /dev/null @@ -1,129 +0,0 @@ --- Hello.Play -- -package main - -import ( - "fmt" -) - -func main() { - fmt.Println("Hello, world!") -} --- Hello.Output -- -Hello, world! --- Import.Play -- -package main - -import ( - "fmt" - "log" - "os/exec" -) - -func main() { - out, err := exec.Command("date").Output() - if err != nil { - log.Fatal(err) - } - fmt.Printf("The date is %s\n", out) -} --- KeyValue.Play -- -package main - -import ( - "fmt" -) - -func main() { - v := struct { - a string - b int - }{ - a: "A", - b: 1, - } - fmt.Print(v) -} --- KeyValue.Output -- -a: "A", b: 1 --- KeyValueImport.Play -- -package main - -import ( - "flag" - "fmt" -) - -func main() { - f := flag.Flag{ - Name: "play", - } - fmt.Print(f) -} --- KeyValueImport.Output -- -Name: "play" --- KeyValueTopDecl.Play -- -package main - -import ( - "fmt" -) - -var keyValueTopDecl = struct { - a string - b int -}{ - a: "B", - b: 2, -} - -func main() { - fmt.Print(keyValueTopDecl) -} --- KeyValueTopDecl.Output -- -a: "B", b: 2 --- Sort.Play -- -package main - -import ( - "fmt" - "sort" -) - -// Person represents a person by name and age. -type Person struct { - Name string - Age int -} - -// String returns a string representation of the Person. -func (p Person) String() string { - return fmt.Sprintf("%s: %d", p.Name, p.Age) -} - -// ByAge implements sort.Interface for []Person based on -// the Age field. -type ByAge []Person - -// Len returns the number of elements in ByAge. -func (a ByAge) Len() int { return len(a) } - -// Swap swaps the elements in ByAge. -func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age } - -// people is the array of Person -var people = []Person{ - {"Bob", 31}, - {"John", 42}, - {"Michael", 17}, - {"Jenny", 26}, -} - -func main() { - fmt.Println(people) - sort.Sort(ByAge(people)) - fmt.Println(people) -} --- Sort.Output -- -[Bob: 31 John: 42 Michael: 17 Jenny: 26] -[Michael: 17 Jenny: 26 Bob: 31 John: 42] diff --git a/internal/backport/go/doc/testdata/examples/values.go b/internal/backport/go/doc/testdata/examples/values.go deleted file mode 100644 index 64b0de476d..0000000000 --- a/internal/backport/go/doc/testdata/examples/values.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -// Variable declaration with fewer values than names. - -func f() (int, int) { - return 1, 2 -} - -var a, b = f() - -// Need two examples to hit playExample. - -func ExampleA() { - _ = a -} - -func ExampleB() { -} diff --git a/internal/backport/go/doc/testdata/examples/values.golden b/internal/backport/go/doc/testdata/examples/values.golden deleted file mode 100644 index 00c19917af..0000000000 --- a/internal/backport/go/doc/testdata/examples/values.golden +++ /dev/null @@ -1,21 +0,0 @@ --- A.Play -- -package main - -import () - -func f() (int, int) { - return 1, 2 -} - -var a, b = f() - -func main() { - _ = a -} --- B.Play -- -package main - -import () - -func main() { -} diff --git a/internal/backport/go/doc/testdata/examples/whole_file.go b/internal/backport/go/doc/testdata/examples/whole_file.go deleted file mode 100644 index 61954cecea..0000000000 --- a/internal/backport/go/doc/testdata/examples/whole_file.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -import "fmt" - -type X int - -func (X) Foo() { -} - -func (X) TestBlah() { -} - -func (X) BenchmarkFoo() { -} - -func Example() { - fmt.Println("Hello, world!") - // Output: Hello, world! -} diff --git a/internal/backport/go/doc/testdata/examples/whole_file.golden b/internal/backport/go/doc/testdata/examples/whole_file.golden deleted file mode 100644 index 74a2291f51..0000000000 --- a/internal/backport/go/doc/testdata/examples/whole_file.golden +++ /dev/null @@ -1,21 +0,0 @@ --- .Play -- -package main - -import "fmt" - -type X int - -func (X) Foo() { -} - -func (X) TestBlah() { -} - -func (X) BenchmarkFoo() { -} - -func main() { - fmt.Println("Hello, world!") -} --- .Output -- -Hello, world! diff --git a/internal/backport/go/doc/testdata/examples/whole_function.go b/internal/backport/go/doc/testdata/examples/whole_function.go deleted file mode 100644 index 1754ee3412..0000000000 --- a/internal/backport/go/doc/testdata/examples/whole_function.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -func Foo(x int) { -} - -func Example() { - fmt.Println("Hello, world!") - // Output: Hello, world! -} diff --git a/internal/backport/go/doc/testdata/examples/whole_function.golden b/internal/backport/go/doc/testdata/examples/whole_function.golden deleted file mode 100644 index 7d5b5cbd7f..0000000000 --- a/internal/backport/go/doc/testdata/examples/whole_function.golden +++ /dev/null @@ -1,11 +0,0 @@ --- .Play -- -package main - -func Foo(x int) { -} - -func main() { - fmt.Println("Hello, world!") -} --- .Output -- -Hello, world! diff --git a/internal/backport/go/doc/testdata/examples/whole_function_external.go b/internal/backport/go/doc/testdata/examples/whole_function_external.go deleted file mode 100644 index 0e0e2f5856..0000000000 --- a/internal/backport/go/doc/testdata/examples/whole_function_external.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package foo_test - -func foo(int) - -func Example() { - foo(42) - // Output: -} diff --git a/internal/backport/go/doc/testdata/examples/whole_function_external.golden b/internal/backport/go/doc/testdata/examples/whole_function_external.golden deleted file mode 100644 index ec8f114abe..0000000000 --- a/internal/backport/go/doc/testdata/examples/whole_function_external.golden +++ /dev/null @@ -1,8 +0,0 @@ --- .Play -- -package main - -func foo(int) - -func main() { - foo(42) -} diff --git a/internal/backport/go/doc/testdata/f.0.golden b/internal/backport/go/doc/testdata/f.0.golden deleted file mode 100644 index 8175901861..0000000000 --- a/internal/backport/go/doc/testdata/f.0.golden +++ /dev/null @@ -1,13 +0,0 @@ -// The package f is a go/doc test for functions and factory ... -PACKAGE f - -IMPORTPATH - testdata/f - -FILENAMES - testdata/f.go - -FUNCTIONS - // Exported must always be visible. Was issue 2824. - func Exported() private - diff --git a/internal/backport/go/doc/testdata/f.1.golden b/internal/backport/go/doc/testdata/f.1.golden deleted file mode 100644 index ba68e884c2..0000000000 --- a/internal/backport/go/doc/testdata/f.1.golden +++ /dev/null @@ -1,16 +0,0 @@ -// The package f is a go/doc test for functions and factory ... -PACKAGE f - -IMPORTPATH - testdata/f - -FILENAMES - testdata/f.go - -TYPES - // - type private struct{} - - // Exported must always be visible. Was issue 2824. - func Exported() private - diff --git a/internal/backport/go/doc/testdata/f.2.golden b/internal/backport/go/doc/testdata/f.2.golden deleted file mode 100644 index 8175901861..0000000000 --- a/internal/backport/go/doc/testdata/f.2.golden +++ /dev/null @@ -1,13 +0,0 @@ -// The package f is a go/doc test for functions and factory ... -PACKAGE f - -IMPORTPATH - testdata/f - -FILENAMES - testdata/f.go - -FUNCTIONS - // Exported must always be visible. Was issue 2824. - func Exported() private - diff --git a/internal/backport/go/doc/testdata/f.go b/internal/backport/go/doc/testdata/f.go deleted file mode 100644 index 7e9add9078..0000000000 --- a/internal/backport/go/doc/testdata/f.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The package f is a go/doc test for functions and factory methods. -package f - -// ---------------------------------------------------------------------------- -// Factory functions for non-exported types must not get lost. - -type private struct{} - -// Exported must always be visible. Was issue 2824. -func Exported() private {} diff --git a/internal/backport/go/doc/testdata/g.0.golden b/internal/backport/go/doc/testdata/g.0.golden deleted file mode 100644 index 487cf06ae5..0000000000 --- a/internal/backport/go/doc/testdata/g.0.golden +++ /dev/null @@ -1,32 +0,0 @@ -// The package g is a go/doc test for mixed exported/unexported ... -PACKAGE g - -IMPORTPATH - testdata/g - -FILENAMES - testdata/g.go - -CONSTANTS - // - const ( - A, _ = iota, iota - _, D - E, _ - G, H - ) - - -VARIABLES - // - var ( - _, C2, _ = 1, 2, 3 - C4, _, C6 = 4, 5, 6 - _, C8, _ = 7, 8, 9 - ) - - // - var ( - _, X = f() - ) - diff --git a/internal/backport/go/doc/testdata/g.1.golden b/internal/backport/go/doc/testdata/g.1.golden deleted file mode 100644 index 438441ac54..0000000000 --- a/internal/backport/go/doc/testdata/g.1.golden +++ /dev/null @@ -1,34 +0,0 @@ -// The package g is a go/doc test for mixed exported/unexported ... -PACKAGE g - -IMPORTPATH - testdata/g - -FILENAMES - testdata/g.go - -CONSTANTS - // - const ( - A, b = iota, iota - c, D - E, f - G, H - ) - - -VARIABLES - // - var ( - c1, C2, c3 = 1, 2, 3 - C4, c5, C6 = 4, 5, 6 - c7, C8, c9 = 7, 8, 9 - xx, yy, zz = 0, 0, 0 // all unexported and hidden - ) - - // - var ( - x, X = f() - y, z = f() - ) - diff --git a/internal/backport/go/doc/testdata/g.2.golden b/internal/backport/go/doc/testdata/g.2.golden deleted file mode 100644 index 487cf06ae5..0000000000 --- a/internal/backport/go/doc/testdata/g.2.golden +++ /dev/null @@ -1,32 +0,0 @@ -// The package g is a go/doc test for mixed exported/unexported ... -PACKAGE g - -IMPORTPATH - testdata/g - -FILENAMES - testdata/g.go - -CONSTANTS - // - const ( - A, _ = iota, iota - _, D - E, _ - G, H - ) - - -VARIABLES - // - var ( - _, C2, _ = 1, 2, 3 - C4, _, C6 = 4, 5, 6 - _, C8, _ = 7, 8, 9 - ) - - // - var ( - _, X = f() - ) - diff --git a/internal/backport/go/doc/testdata/g.go b/internal/backport/go/doc/testdata/g.go deleted file mode 100644 index ceeb417443..0000000000 --- a/internal/backport/go/doc/testdata/g.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The package g is a go/doc test for mixed exported/unexported values. -package g - -const ( - A, b = iota, iota - c, D - E, f - G, H -) - -var ( - c1, C2, c3 = 1, 2, 3 - C4, c5, C6 = 4, 5, 6 - c7, C8, c9 = 7, 8, 9 - xx, yy, zz = 0, 0, 0 // all unexported and hidden -) - -var ( - x, X = f() - y, z = f() -) diff --git a/internal/backport/go/doc/testdata/generics.0.golden b/internal/backport/go/doc/testdata/generics.0.golden deleted file mode 100644 index 91c874c84d..0000000000 --- a/internal/backport/go/doc/testdata/generics.0.golden +++ /dev/null @@ -1,76 +0,0 @@ -// Package generics contains the new syntax supporting generic ... -PACKAGE generics - -IMPORTPATH - testdata/generics - -FILENAMES - testdata/generics.go - -FUNCTIONS - // AnotherFunc has an implicit constraint interface. Neither type ... - func AnotherFunc[T ~struct{ f int }](_ struct{ f int }) - - // Func has an instantiated constraint. - func Func[T Constraint[string, Type[int]]]() - - // Single is not a factory function. - func Single[T any]() *T - - // Slice is not a factory function. - func Slice[T any]() []T - - -TYPES - // AFuncType demonstrates filtering of parameters and type ... - type AFuncType[T ~struct{ f int }] func(_ struct { - // contains filtered or unexported fields - }) - - // Constraint is a constraint interface with two type parameters. - type Constraint[P, Q interface{ string | ~int | Type[int] }] interface { - ~int | ~byte | Type[string] - M() P - } - - // NewEmbeddings demonstrates how we filter the new embedded ... - type NewEmbeddings interface { - string // should not be filtered - - struct { - // contains filtered or unexported fields - } - ~struct { - // contains filtered or unexported fields - } - *struct { - // contains filtered or unexported fields - } - struct { - // contains filtered or unexported fields - } | ~struct { - // contains filtered or unexported fields - } - // contains filtered or unexported methods - } - - // Parameterized types should be shown. - type Type[P any] struct { - Field P - } - - // Variables with an instantiated type should be shown. - var X Type[int] - - // Constructors for parameterized types should be shown. - func Constructor[lowerCase any]() Type[lowerCase] - - // MethodA uses a different name for its receiver type parameter. - func (t Type[A]) MethodA(p A) - - // MethodB has a blank receiver type parameter. - func (t Type[_]) MethodB() - - // MethodC has a lower-case receiver type parameter. - func (t Type[c]) MethodC() - diff --git a/internal/backport/go/doc/testdata/generics.1.golden b/internal/backport/go/doc/testdata/generics.1.golden deleted file mode 100644 index 923a4ce5d9..0000000000 --- a/internal/backport/go/doc/testdata/generics.1.golden +++ /dev/null @@ -1,66 +0,0 @@ -// Package generics contains the new syntax supporting generic ... -PACKAGE generics - -IMPORTPATH - testdata/generics - -FILENAMES - testdata/generics.go - -FUNCTIONS - // AnotherFunc has an implicit constraint interface. Neither type ... - func AnotherFunc[T ~struct{ f int }](_ struct{ f int }) - - // Func has an instantiated constraint. - func Func[T Constraint[string, Type[int]]]() - - // Single is not a factory function. - func Single[T any]() *T - - // Slice is not a factory function. - func Slice[T any]() []T - - -TYPES - // AFuncType demonstrates filtering of parameters and type ... - type AFuncType[T ~struct{ f int }] func(_ struct{ f int }) - - // Constraint is a constraint interface with two type parameters. - type Constraint[P, Q interface{ string | ~int | Type[int] }] interface { - ~int | ~byte | Type[string] - M() P - } - - // NewEmbeddings demonstrates how we filter the new embedded ... - type NewEmbeddings interface { - string // should not be filtered - int16 - struct{ f int } - ~struct{ f int } - *struct{ f int } - struct{ f int } | ~struct{ f int } - } - - // Parameterized types should be shown. - type Type[P any] struct { - Field P - } - - // Variables with an instantiated type should be shown. - var X Type[int] - - // Constructors for parameterized types should be shown. - func Constructor[lowerCase any]() Type[lowerCase] - - // MethodA uses a different name for its receiver type parameter. - func (t Type[A]) MethodA(p A) - - // MethodB has a blank receiver type parameter. - func (t Type[_]) MethodB() - - // MethodC has a lower-case receiver type parameter. - func (t Type[c]) MethodC() - - // int16 shadows the predeclared type int16. - type int16 int - diff --git a/internal/backport/go/doc/testdata/generics.2.golden b/internal/backport/go/doc/testdata/generics.2.golden deleted file mode 100644 index 91c874c84d..0000000000 --- a/internal/backport/go/doc/testdata/generics.2.golden +++ /dev/null @@ -1,76 +0,0 @@ -// Package generics contains the new syntax supporting generic ... -PACKAGE generics - -IMPORTPATH - testdata/generics - -FILENAMES - testdata/generics.go - -FUNCTIONS - // AnotherFunc has an implicit constraint interface. Neither type ... - func AnotherFunc[T ~struct{ f int }](_ struct{ f int }) - - // Func has an instantiated constraint. - func Func[T Constraint[string, Type[int]]]() - - // Single is not a factory function. - func Single[T any]() *T - - // Slice is not a factory function. - func Slice[T any]() []T - - -TYPES - // AFuncType demonstrates filtering of parameters and type ... - type AFuncType[T ~struct{ f int }] func(_ struct { - // contains filtered or unexported fields - }) - - // Constraint is a constraint interface with two type parameters. - type Constraint[P, Q interface{ string | ~int | Type[int] }] interface { - ~int | ~byte | Type[string] - M() P - } - - // NewEmbeddings demonstrates how we filter the new embedded ... - type NewEmbeddings interface { - string // should not be filtered - - struct { - // contains filtered or unexported fields - } - ~struct { - // contains filtered or unexported fields - } - *struct { - // contains filtered or unexported fields - } - struct { - // contains filtered or unexported fields - } | ~struct { - // contains filtered or unexported fields - } - // contains filtered or unexported methods - } - - // Parameterized types should be shown. - type Type[P any] struct { - Field P - } - - // Variables with an instantiated type should be shown. - var X Type[int] - - // Constructors for parameterized types should be shown. - func Constructor[lowerCase any]() Type[lowerCase] - - // MethodA uses a different name for its receiver type parameter. - func (t Type[A]) MethodA(p A) - - // MethodB has a blank receiver type parameter. - func (t Type[_]) MethodB() - - // MethodC has a lower-case receiver type parameter. - func (t Type[c]) MethodC() - diff --git a/internal/backport/go/doc/testdata/generics.go b/internal/backport/go/doc/testdata/generics.go deleted file mode 100644 index ba7187e4dd..0000000000 --- a/internal/backport/go/doc/testdata/generics.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package generics contains the new syntax supporting generic programming in -// Go. -package generics - -// Variables with an instantiated type should be shown. -var X Type[int] - -// Parameterized types should be shown. -type Type[P any] struct { - Field P -} - -// Constructors for parameterized types should be shown. -func Constructor[lowerCase any]() Type[lowerCase] { - return Type[lowerCase]{} -} - -// MethodA uses a different name for its receiver type parameter. -func (t Type[A]) MethodA(p A) {} - -// MethodB has a blank receiver type parameter. -func (t Type[_]) MethodB() {} - -// MethodC has a lower-case receiver type parameter. -func (t Type[c]) MethodC() {} - -// Constraint is a constraint interface with two type parameters. -type Constraint[P, Q interface{ string | ~int | Type[int] }] interface { - ~int | ~byte | Type[string] - M() P -} - -// int16 shadows the predeclared type int16. -type int16 int - -// NewEmbeddings demonstrates how we filter the new embedded elements. -type NewEmbeddings interface { - string // should not be filtered - int16 - struct{ f int } - ~struct{ f int } - *struct{ f int } - struct{ f int } | ~struct{ f int } -} - -// Func has an instantiated constraint. -func Func[T Constraint[string, Type[int]]]() {} - -// AnotherFunc has an implicit constraint interface. -// -// Neither type parameters nor regular parameters should be filtered. -func AnotherFunc[T ~struct{ f int }](_ struct{ f int }) {} - -// AFuncType demonstrates filtering of parameters and type parameters. Here we -// don't filter type parameters (to be consistent with function declarations), -// but DO filter the RHS. -type AFuncType[T ~struct{ f int }] func(_ struct{ f int }) - -// See issue #49477: type parameters should not be interpreted as named types -// for the purpose of determining whether a function is a factory function. - -// Slice is not a factory function. -func Slice[T any]() []T { - return nil -} - -// Single is not a factory function. -func Single[T any]() *T { - return nil -} diff --git a/internal/backport/go/doc/testdata/issue12839.0.golden b/internal/backport/go/doc/testdata/issue12839.0.golden deleted file mode 100644 index 6b59774fb9..0000000000 --- a/internal/backport/go/doc/testdata/issue12839.0.golden +++ /dev/null @@ -1,51 +0,0 @@ -// Package issue12839 is a go/doc test to test association of a ... -PACKAGE issue12839 - -IMPORTPATH - testdata/issue12839 - -IMPORTS - p - -FILENAMES - testdata/issue12839.go - -FUNCTIONS - // F1 should not be associated with T1 - func F1() (*T1, *T2) - - // F10 should not be associated with T1. - func F10() (T1, T2, error) - - // F4 should not be associated with a type (same as F1) - func F4() (a T1, b T2) - - // F9 should not be associated with T1. - func F9() (int, T1, T2) - - -TYPES - // - type T1 struct{} - - // F2 should be associated with T1 - func F2() (a, b, c T1) - - // F3 should be associated with T1 because b.T3 is from a ... - func F3() (a T1, b p.T3) - - // F5 should be associated with T1. - func F5() (T1, error) - - // F6 should be associated with T1. - func F6() (*T1, error) - - // F7 should be associated with T1. - func F7() (T1, string) - - // F8 should be associated with T1. - func F8() (int, T1, string) - - // - type T2 struct{} - diff --git a/internal/backport/go/doc/testdata/issue12839.1.golden b/internal/backport/go/doc/testdata/issue12839.1.golden deleted file mode 100644 index 4b9b9f6477..0000000000 --- a/internal/backport/go/doc/testdata/issue12839.1.golden +++ /dev/null @@ -1,54 +0,0 @@ -// Package issue12839 is a go/doc test to test association of a ... -PACKAGE issue12839 - -IMPORTPATH - testdata/issue12839 - -IMPORTS - p - -FILENAMES - testdata/issue12839.go - -FUNCTIONS - // F1 should not be associated with T1 - func F1() (*T1, *T2) - - // F10 should not be associated with T1. - func F10() (T1, T2, error) - - // F4 should not be associated with a type (same as F1) - func F4() (a T1, b T2) - - // F9 should not be associated with T1. - func F9() (int, T1, T2) - - -TYPES - // - type T1 struct{} - - // F2 should be associated with T1 - func F2() (a, b, c T1) - - // F3 should be associated with T1 because b.T3 is from a ... - func F3() (a T1, b p.T3) - - // F5 should be associated with T1. - func F5() (T1, error) - - // F6 should be associated with T1. - func F6() (*T1, error) - - // F7 should be associated with T1. - func F7() (T1, string) - - // F8 should be associated with T1. - func F8() (int, T1, string) - - // - func (t T1) hello() string - - // - type T2 struct{} - diff --git a/internal/backport/go/doc/testdata/issue12839.2.golden b/internal/backport/go/doc/testdata/issue12839.2.golden deleted file mode 100644 index 6b59774fb9..0000000000 --- a/internal/backport/go/doc/testdata/issue12839.2.golden +++ /dev/null @@ -1,51 +0,0 @@ -// Package issue12839 is a go/doc test to test association of a ... -PACKAGE issue12839 - -IMPORTPATH - testdata/issue12839 - -IMPORTS - p - -FILENAMES - testdata/issue12839.go - -FUNCTIONS - // F1 should not be associated with T1 - func F1() (*T1, *T2) - - // F10 should not be associated with T1. - func F10() (T1, T2, error) - - // F4 should not be associated with a type (same as F1) - func F4() (a T1, b T2) - - // F9 should not be associated with T1. - func F9() (int, T1, T2) - - -TYPES - // - type T1 struct{} - - // F2 should be associated with T1 - func F2() (a, b, c T1) - - // F3 should be associated with T1 because b.T3 is from a ... - func F3() (a T1, b p.T3) - - // F5 should be associated with T1. - func F5() (T1, error) - - // F6 should be associated with T1. - func F6() (*T1, error) - - // F7 should be associated with T1. - func F7() (T1, string) - - // F8 should be associated with T1. - func F8() (int, T1, string) - - // - type T2 struct{} - diff --git a/internal/backport/go/doc/testdata/issue12839.go b/internal/backport/go/doc/testdata/issue12839.go deleted file mode 100644 index 51c7ac1268..0000000000 --- a/internal/backport/go/doc/testdata/issue12839.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package issue12839 is a go/doc test to test association of a function -// that returns multiple types. -// See golang.org/issue/12839. -// (See also golang.org/issue/27928.) -package issue12839 - -import "p" - -type T1 struct{} - -type T2 struct{} - -func (t T1) hello() string { - return "hello" -} - -// F1 should not be associated with T1 -func F1() (*T1, *T2) { - return &T1{}, &T2{} -} - -// F2 should be associated with T1 -func F2() (a, b, c T1) { - return T1{}, T1{}, T1{} -} - -// F3 should be associated with T1 because b.T3 is from a different package -func F3() (a T1, b p.T3) { - return T1{}, p.T3{} -} - -// F4 should not be associated with a type (same as F1) -func F4() (a T1, b T2) { - return T1{}, T2{} -} - -// F5 should be associated with T1. -func F5() (T1, error) { - return T1{}, nil -} - -// F6 should be associated with T1. -func F6() (*T1, error) { - return &T1{}, nil -} - -// F7 should be associated with T1. -func F7() (T1, string) { - return T1{}, nil -} - -// F8 should be associated with T1. -func F8() (int, T1, string) { - return 0, T1{}, nil -} - -// F9 should not be associated with T1. -func F9() (int, T1, T2) { - return 0, T1{}, T2{} -} - -// F10 should not be associated with T1. -func F10() (T1, T2, error) { - return T1{}, T2{}, nil -} diff --git a/internal/backport/go/doc/testdata/issue13742.0.golden b/internal/backport/go/doc/testdata/issue13742.0.golden deleted file mode 100644 index 8dee9aaa80..0000000000 --- a/internal/backport/go/doc/testdata/issue13742.0.golden +++ /dev/null @@ -1,25 +0,0 @@ -// -PACKAGE issue13742 - -IMPORTPATH - testdata/issue13742 - -IMPORTS - go/ast - -FILENAMES - testdata/issue13742.go - -FUNCTIONS - // Both F0 and G0 should appear as functions. - func F0(Node) - - // Both F1 and G1 should appear as functions. - func F1(ast.Node) - - // - func G0() Node - - // - func G1() ast.Node - diff --git a/internal/backport/go/doc/testdata/issue13742.1.golden b/internal/backport/go/doc/testdata/issue13742.1.golden deleted file mode 100644 index 8dee9aaa80..0000000000 --- a/internal/backport/go/doc/testdata/issue13742.1.golden +++ /dev/null @@ -1,25 +0,0 @@ -// -PACKAGE issue13742 - -IMPORTPATH - testdata/issue13742 - -IMPORTS - go/ast - -FILENAMES - testdata/issue13742.go - -FUNCTIONS - // Both F0 and G0 should appear as functions. - func F0(Node) - - // Both F1 and G1 should appear as functions. - func F1(ast.Node) - - // - func G0() Node - - // - func G1() ast.Node - diff --git a/internal/backport/go/doc/testdata/issue13742.2.golden b/internal/backport/go/doc/testdata/issue13742.2.golden deleted file mode 100644 index 8dee9aaa80..0000000000 --- a/internal/backport/go/doc/testdata/issue13742.2.golden +++ /dev/null @@ -1,25 +0,0 @@ -// -PACKAGE issue13742 - -IMPORTPATH - testdata/issue13742 - -IMPORTS - go/ast - -FILENAMES - testdata/issue13742.go - -FUNCTIONS - // Both F0 and G0 should appear as functions. - func F0(Node) - - // Both F1 and G1 should appear as functions. - func F1(ast.Node) - - // - func G0() Node - - // - func G1() ast.Node - diff --git a/internal/backport/go/doc/testdata/issue13742.go b/internal/backport/go/doc/testdata/issue13742.go deleted file mode 100644 index dbc19411a6..0000000000 --- a/internal/backport/go/doc/testdata/issue13742.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package issue13742 - -import ( - "go/ast" - . "go/ast" -) - -// Both F0 and G0 should appear as functions. -func F0(Node) {} -func G0() Node { return nil } - -// Both F1 and G1 should appear as functions. -func F1(ast.Node) {} -func G1() ast.Node { return nil } diff --git a/internal/backport/go/doc/testdata/issue16153.0.golden b/internal/backport/go/doc/testdata/issue16153.0.golden deleted file mode 100644 index 189260b4d0..0000000000 --- a/internal/backport/go/doc/testdata/issue16153.0.golden +++ /dev/null @@ -1,32 +0,0 @@ -// -PACKAGE issue16153 - -IMPORTPATH - testdata/issue16153 - -FILENAMES - testdata/issue16153.go - -CONSTANTS - // - const ( - X3 int64 = iota - Y3 = 1 - ) - - // - const ( - X4 int64 = iota - Y4 - ) - - // original test case - const ( - Y1 = 256 - ) - - // variations - const ( - Y2 uint8 - ) - diff --git a/internal/backport/go/doc/testdata/issue16153.1.golden b/internal/backport/go/doc/testdata/issue16153.1.golden deleted file mode 100644 index 803df3e709..0000000000 --- a/internal/backport/go/doc/testdata/issue16153.1.golden +++ /dev/null @@ -1,34 +0,0 @@ -// -PACKAGE issue16153 - -IMPORTPATH - testdata/issue16153 - -FILENAMES - testdata/issue16153.go - -CONSTANTS - // original test case - const ( - x1 uint8 = 255 - Y1 = 256 - ) - - // variations - const ( - x2 uint8 = 255 - Y2 - ) - - // - const ( - X3 int64 = iota - Y3 = 1 - ) - - // - const ( - X4 int64 = iota - Y4 - ) - diff --git a/internal/backport/go/doc/testdata/issue16153.2.golden b/internal/backport/go/doc/testdata/issue16153.2.golden deleted file mode 100644 index 189260b4d0..0000000000 --- a/internal/backport/go/doc/testdata/issue16153.2.golden +++ /dev/null @@ -1,32 +0,0 @@ -// -PACKAGE issue16153 - -IMPORTPATH - testdata/issue16153 - -FILENAMES - testdata/issue16153.go - -CONSTANTS - // - const ( - X3 int64 = iota - Y3 = 1 - ) - - // - const ( - X4 int64 = iota - Y4 - ) - - // original test case - const ( - Y1 = 256 - ) - - // variations - const ( - Y2 uint8 - ) - diff --git a/internal/backport/go/doc/testdata/issue16153.go b/internal/backport/go/doc/testdata/issue16153.go deleted file mode 100644 index 528be42356..0000000000 --- a/internal/backport/go/doc/testdata/issue16153.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package issue16153 - -// original test case -const ( - x1 uint8 = 255 - Y1 = 256 -) - -// variations -const ( - x2 uint8 = 255 - Y2 -) - -const ( - X3 int64 = iota - Y3 = 1 -) - -const ( - X4 int64 = iota - Y4 -) diff --git a/internal/backport/go/doc/testdata/issue17788.0.golden b/internal/backport/go/doc/testdata/issue17788.0.golden deleted file mode 100644 index 42c00da504..0000000000 --- a/internal/backport/go/doc/testdata/issue17788.0.golden +++ /dev/null @@ -1,8 +0,0 @@ -// -PACKAGE issue17788 - -IMPORTPATH - testdata/issue17788 - -FILENAMES - testdata/issue17788.go diff --git a/internal/backport/go/doc/testdata/issue17788.1.golden b/internal/backport/go/doc/testdata/issue17788.1.golden deleted file mode 100644 index 42c00da504..0000000000 --- a/internal/backport/go/doc/testdata/issue17788.1.golden +++ /dev/null @@ -1,8 +0,0 @@ -// -PACKAGE issue17788 - -IMPORTPATH - testdata/issue17788 - -FILENAMES - testdata/issue17788.go diff --git a/internal/backport/go/doc/testdata/issue17788.2.golden b/internal/backport/go/doc/testdata/issue17788.2.golden deleted file mode 100644 index 42c00da504..0000000000 --- a/internal/backport/go/doc/testdata/issue17788.2.golden +++ /dev/null @@ -1,8 +0,0 @@ -// -PACKAGE issue17788 - -IMPORTPATH - testdata/issue17788 - -FILENAMES - testdata/issue17788.go diff --git a/internal/backport/go/doc/testdata/issue17788.go b/internal/backport/go/doc/testdata/issue17788.go deleted file mode 100644 index 883ad5f769..0000000000 --- a/internal/backport/go/doc/testdata/issue17788.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package issue17788 - -func ( /* receiver type */ ) f0() { -} diff --git a/internal/backport/go/doc/testdata/issue22856.0.golden b/internal/backport/go/doc/testdata/issue22856.0.golden deleted file mode 100644 index a88f43f4bd..0000000000 --- a/internal/backport/go/doc/testdata/issue22856.0.golden +++ /dev/null @@ -1,45 +0,0 @@ -// -PACKAGE issue22856 - -IMPORTPATH - testdata/issue22856 - -FILENAMES - testdata/issue22856.go - -FUNCTIONS - // NewPointerSliceOfSlice is not a factory function because slices ... - func NewPointerSliceOfSlice() [][]*T - - // NewSlice3 is not a factory function because 3 nested slices of ... - func NewSlice3() [][][]T - - // NewSliceOfSlice is not a factory function because slices of a ... - func NewSliceOfSlice() [][]T - - -TYPES - // - type T struct{} - - // - func New() T - - // - func NewArray() [1]T - - // - func NewPointer() *T - - // - func NewPointerArray() [1]*T - - // - func NewPointerOfPointer() **T - - // - func NewPointerSlice() []*T - - // - func NewSlice() []T - diff --git a/internal/backport/go/doc/testdata/issue22856.1.golden b/internal/backport/go/doc/testdata/issue22856.1.golden deleted file mode 100644 index a88f43f4bd..0000000000 --- a/internal/backport/go/doc/testdata/issue22856.1.golden +++ /dev/null @@ -1,45 +0,0 @@ -// -PACKAGE issue22856 - -IMPORTPATH - testdata/issue22856 - -FILENAMES - testdata/issue22856.go - -FUNCTIONS - // NewPointerSliceOfSlice is not a factory function because slices ... - func NewPointerSliceOfSlice() [][]*T - - // NewSlice3 is not a factory function because 3 nested slices of ... - func NewSlice3() [][][]T - - // NewSliceOfSlice is not a factory function because slices of a ... - func NewSliceOfSlice() [][]T - - -TYPES - // - type T struct{} - - // - func New() T - - // - func NewArray() [1]T - - // - func NewPointer() *T - - // - func NewPointerArray() [1]*T - - // - func NewPointerOfPointer() **T - - // - func NewPointerSlice() []*T - - // - func NewSlice() []T - diff --git a/internal/backport/go/doc/testdata/issue22856.2.golden b/internal/backport/go/doc/testdata/issue22856.2.golden deleted file mode 100644 index a88f43f4bd..0000000000 --- a/internal/backport/go/doc/testdata/issue22856.2.golden +++ /dev/null @@ -1,45 +0,0 @@ -// -PACKAGE issue22856 - -IMPORTPATH - testdata/issue22856 - -FILENAMES - testdata/issue22856.go - -FUNCTIONS - // NewPointerSliceOfSlice is not a factory function because slices ... - func NewPointerSliceOfSlice() [][]*T - - // NewSlice3 is not a factory function because 3 nested slices of ... - func NewSlice3() [][][]T - - // NewSliceOfSlice is not a factory function because slices of a ... - func NewSliceOfSlice() [][]T - - -TYPES - // - type T struct{} - - // - func New() T - - // - func NewArray() [1]T - - // - func NewPointer() *T - - // - func NewPointerArray() [1]*T - - // - func NewPointerOfPointer() **T - - // - func NewPointerSlice() []*T - - // - func NewSlice() []T - diff --git a/internal/backport/go/doc/testdata/issue22856.go b/internal/backport/go/doc/testdata/issue22856.go deleted file mode 100644 index f4569981aa..0000000000 --- a/internal/backport/go/doc/testdata/issue22856.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package issue22856 - -type T struct{} - -func New() T { return T{} } -func NewPointer() *T { return &T{} } -func NewPointerSlice() []*T { return []*T{&T{}} } -func NewSlice() []T { return []T{T{}} } -func NewPointerOfPointer() **T { x := &T{}; return &x } -func NewArray() [1]T { return [1]T{T{}} } -func NewPointerArray() [1]*T { return [1]*T{&T{}} } - -// NewSliceOfSlice is not a factory function because slices of a slice of -// type *T are not factory functions of type T. -func NewSliceOfSlice() [][]T { return []T{[]T{}} } - -// NewPointerSliceOfSlice is not a factory function because slices of a -// slice of type *T are not factory functions of type T. -func NewPointerSliceOfSlice() [][]*T { return []*T{[]*T{}} } - -// NewSlice3 is not a factory function because 3 nested slices of type T -// are not factory functions of type T. -func NewSlice3() [][][]T { return []T{[]T{[]T{}}} } diff --git a/internal/backport/go/doc/testdata/predeclared.0.golden b/internal/backport/go/doc/testdata/predeclared.0.golden deleted file mode 100644 index 9f37b069f0..0000000000 --- a/internal/backport/go/doc/testdata/predeclared.0.golden +++ /dev/null @@ -1,8 +0,0 @@ -// Package predeclared is a go/doc test for handling of exported ... -PACKAGE predeclared - -IMPORTPATH - testdata/predeclared - -FILENAMES - testdata/predeclared.go diff --git a/internal/backport/go/doc/testdata/predeclared.1.golden b/internal/backport/go/doc/testdata/predeclared.1.golden deleted file mode 100644 index 2ff8ee666b..0000000000 --- a/internal/backport/go/doc/testdata/predeclared.1.golden +++ /dev/null @@ -1,22 +0,0 @@ -// Package predeclared is a go/doc test for handling of exported ... -PACKAGE predeclared - -IMPORTPATH - testdata/predeclared - -FILENAMES - testdata/predeclared.go - -TYPES - // - type bool int - - // Must not be visible. - func (b bool) String() string - - // - type error struct{} - - // Must not be visible. - func (e error) Error() string - diff --git a/internal/backport/go/doc/testdata/predeclared.2.golden b/internal/backport/go/doc/testdata/predeclared.2.golden deleted file mode 100644 index 9f37b069f0..0000000000 --- a/internal/backport/go/doc/testdata/predeclared.2.golden +++ /dev/null @@ -1,8 +0,0 @@ -// Package predeclared is a go/doc test for handling of exported ... -PACKAGE predeclared - -IMPORTPATH - testdata/predeclared - -FILENAMES - testdata/predeclared.go diff --git a/internal/backport/go/doc/testdata/predeclared.go b/internal/backport/go/doc/testdata/predeclared.go deleted file mode 100644 index c6dd806cba..0000000000 --- a/internal/backport/go/doc/testdata/predeclared.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package predeclared is a go/doc test for handling of -// exported methods on locally-defined predeclared types. -// See issue 9860. -package predeclared - -type error struct{} - -// Must not be visible. -func (e error) Error() string { - return "" -} - -type bool int - -// Must not be visible. -func (b bool) String() string { - return "" -} diff --git a/internal/backport/go/doc/testdata/template.txt b/internal/backport/go/doc/testdata/template.txt deleted file mode 100644 index 1b07382611..0000000000 --- a/internal/backport/go/doc/testdata/template.txt +++ /dev/null @@ -1,68 +0,0 @@ -{{synopsis .Doc}} -PACKAGE {{.Name}} - -IMPORTPATH - {{.ImportPath}} - -{{with .Imports}}IMPORTS -{{range .}} {{.}} -{{end}} -{{end}}{{/* - -*/}}FILENAMES -{{range .Filenames}} {{.}} -{{end}}{{/* - -*/}}{{with .Consts}} -CONSTANTS -{{range .}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{end}}{{end}}{{/* - -*/}}{{with .Vars}} -VARIABLES -{{range .}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{end}}{{end}}{{/* - -*/}}{{with .Funcs}} -FUNCTIONS -{{range .}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{end}}{{end}}{{/* - -*/}}{{with .Types}} -TYPES -{{range .}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{range .Consts}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{end}}{{/* - -*/}}{{range .Vars}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{end}}{{/* - -*/}}{{range .Funcs}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{end}}{{/* - -*/}}{{range .Methods}} {{synopsis .Doc}} - {{node .Decl $.FSet}} - -{{end}}{{end}}{{end}}{{/* - -*/}}{{with .Bugs}} -BUGS .Bugs is now deprecated, please use .Notes instead -{{range .}}{{indent "\t" .}} -{{end}}{{end}}{{with .Notes}}{{range $marker, $content := .}} -{{$marker}}S -{{range $content}}{{$marker}}({{.UID}}){{indent "\t" .Body}} -{{end}}{{end}}{{end}} \ No newline at end of file diff --git a/internal/backport/go/doc/testdata/testing.0.golden b/internal/backport/go/doc/testdata/testing.0.golden deleted file mode 100644 index 61dac8bb66..0000000000 --- a/internal/backport/go/doc/testdata/testing.0.golden +++ /dev/null @@ -1,156 +0,0 @@ -// Package testing provides support for automated testing of Go ... -PACKAGE testing - -IMPORTPATH - testdata/testing - -IMPORTS - bytes - flag - fmt - io - os - runtime - runtime/pprof - strconv - strings - time - -FILENAMES - testdata/benchmark.go - testdata/example.go - testdata/testing.go - -FUNCTIONS - // An internal function but exported because it is cross-package; ... - func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) - - // An internal function but exported because it is cross-package; ... - func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark) - - // - func RunExamples(examples []InternalExample) (ok bool) - - // - func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) - - // Short reports whether the -test.short flag is set. - func Short() bool - - -TYPES - // B is a type passed to Benchmark functions to manage benchmark ... - type B struct { - N int - // contains filtered or unexported fields - } - - // Error is equivalent to Log() followed by Fail(). - func (c *B) Error(args ...any) - - // Errorf is equivalent to Logf() followed by Fail(). - func (c *B) Errorf(format string, args ...any) - - // Fail marks the function as having failed but continues ... - func (c *B) Fail() - - // FailNow marks the function as having failed and stops its ... - func (c *B) FailNow() - - // Failed reports whether the function has failed. - func (c *B) Failed() bool - - // Fatal is equivalent to Log() followed by FailNow(). - func (c *B) Fatal(args ...any) - - // Fatalf is equivalent to Logf() followed by FailNow(). - func (c *B) Fatalf(format string, args ...any) - - // Log formats its arguments using default formatting, analogous ... - func (c *B) Log(args ...any) - - // Logf formats its arguments according to the format, analogous ... - func (c *B) Logf(format string, args ...any) - - // ResetTimer sets the elapsed benchmark time to zero. It does not ... - func (b *B) ResetTimer() - - // SetBytes records the number of bytes processed in a single ... - func (b *B) SetBytes(n int64) - - // StartTimer starts timing a test. This function is called ... - func (b *B) StartTimer() - - // StopTimer stops timing a test. This can be used to pause the ... - func (b *B) StopTimer() - - // The results of a benchmark run. - type BenchmarkResult struct { - N int // The number of iterations. - T time.Duration // The total time taken. - Bytes int64 // Bytes processed in one iteration. - } - - // Benchmark benchmarks a single function. Useful for creating ... - func Benchmark(f func(b *B)) BenchmarkResult - - // - func (r BenchmarkResult) NsPerOp() int64 - - // - func (r BenchmarkResult) String() string - - // An internal type but exported because it is cross-package; part ... - type InternalBenchmark struct { - Name string - F func(b *B) - } - - // - type InternalExample struct { - Name string - F func() - Output string - } - - // An internal type but exported because it is cross-package; part ... - type InternalTest struct { - Name string - F func(*T) - } - - // T is a type passed to Test functions to manage test state and ... - type T struct { - // contains filtered or unexported fields - } - - // Error is equivalent to Log() followed by Fail(). - func (c *T) Error(args ...any) - - // Errorf is equivalent to Logf() followed by Fail(). - func (c *T) Errorf(format string, args ...any) - - // Fail marks the function as having failed but continues ... - func (c *T) Fail() - - // FailNow marks the function as having failed and stops its ... - func (c *T) FailNow() - - // Failed reports whether the function has failed. - func (c *T) Failed() bool - - // Fatal is equivalent to Log() followed by FailNow(). - func (c *T) Fatal(args ...any) - - // Fatalf is equivalent to Logf() followed by FailNow(). - func (c *T) Fatalf(format string, args ...any) - - // Log formats its arguments using default formatting, analogous ... - func (c *T) Log(args ...any) - - // Logf formats its arguments according to the format, analogous ... - func (c *T) Logf(format string, args ...any) - - // Parallel signals that this test is to be run in parallel with ... - func (t *T) Parallel() - diff --git a/internal/backport/go/doc/testdata/testing.1.golden b/internal/backport/go/doc/testdata/testing.1.golden deleted file mode 100644 index 1655af11a8..0000000000 --- a/internal/backport/go/doc/testdata/testing.1.golden +++ /dev/null @@ -1,298 +0,0 @@ -// Package testing provides support for automated testing of Go ... -PACKAGE testing - -IMPORTPATH - testdata/testing - -IMPORTS - bytes - flag - fmt - io - os - runtime - runtime/pprof - strconv - strings - time - -FILENAMES - testdata/benchmark.go - testdata/example.go - testdata/testing.go - -VARIABLES - // - var ( - // The short flag requests that tests run more quickly, but its functionality - // is provided by test writers themselves. The testing package is just its - // home. The all.bash installation script sets it to make installation more - // efficient, but by default the flag is off so a plain "go test" will do a - // full test of the package. - short = flag.Bool("test.short", false, "run smaller test suite to save time") - - // Report as tests are run; default is silent for success. - chatty = flag.Bool("test.v", false, "verbose: print additional output") - match = flag.String("test.run", "", "regular expression to select tests to run") - memProfile = flag.String("test.memprofile", "", "write a memory profile to the named file after execution") - memProfileRate = flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate") - cpuProfile = flag.String("test.cpuprofile", "", "write a cpu profile to the named file during execution") - timeout = flag.Duration("test.timeout", 0, "if positive, sets an aggregate time limit for all tests") - cpuListStr = flag.String("test.cpu", "", "comma-separated list of number of CPUs to use for each test") - parallel = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "maximum test parallelism") - - cpuList []int - ) - - // - var benchTime = flag.Duration("test.benchtime", 1*time.Second, "approximate run time for each benchmark") - - // - var matchBenchmarks = flag.String("test.bench", "", "regular expression to select benchmarks to run") - - // - var timer *time.Timer - - -FUNCTIONS - // An internal function but exported because it is cross-package; ... - func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) - - // An internal function but exported because it is cross-package; ... - func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark) - - // - func RunExamples(examples []InternalExample) (ok bool) - - // - func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) - - // Short reports whether the -test.short flag is set. - func Short() bool - - // after runs after all testing. - func after() - - // alarm is called if the timeout expires. - func alarm() - - // before runs before all testing. - func before() - - // decorate inserts the final newline if needed and indentation ... - func decorate(s string, addFileLine bool) string - - // - func max(x, y int) int - - // - func min(x, y int) int - - // - func parseCpuList() - - // roundDown10 rounds a number down to the nearest power of 10. - func roundDown10(n int) int - - // roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. - func roundUp(n int) int - - // startAlarm starts an alarm if requested. - func startAlarm() - - // stopAlarm turns off the alarm. - func stopAlarm() - - // - func tRunner(t *T, test *InternalTest) - - -TYPES - // B is a type passed to Benchmark functions to manage benchmark ... - type B struct { - common - N int - benchmark InternalBenchmark - bytes int64 - timerOn bool - result BenchmarkResult - } - - // Error is equivalent to Log() followed by Fail(). - func (c *B) Error(args ...any) - - // Errorf is equivalent to Logf() followed by Fail(). - func (c *B) Errorf(format string, args ...any) - - // Fail marks the function as having failed but continues ... - func (c *B) Fail() - - // FailNow marks the function as having failed and stops its ... - func (c *B) FailNow() - - // Failed reports whether the function has failed. - func (c *B) Failed() bool - - // Fatal is equivalent to Log() followed by FailNow(). - func (c *B) Fatal(args ...any) - - // Fatalf is equivalent to Logf() followed by FailNow(). - func (c *B) Fatalf(format string, args ...any) - - // Log formats its arguments using default formatting, analogous ... - func (c *B) Log(args ...any) - - // Logf formats its arguments according to the format, analogous ... - func (c *B) Logf(format string, args ...any) - - // ResetTimer sets the elapsed benchmark time to zero. It does not ... - func (b *B) ResetTimer() - - // SetBytes records the number of bytes processed in a single ... - func (b *B) SetBytes(n int64) - - // StartTimer starts timing a test. This function is called ... - func (b *B) StartTimer() - - // StopTimer stops timing a test. This can be used to pause the ... - func (b *B) StopTimer() - - // launch launches the benchmark function. It gradually increases ... - func (b *B) launch() - - // log generates the output. It's always at the same stack depth. - func (c *B) log(s string) - - // - func (b *B) nsPerOp() int64 - - // run times the benchmark function in a separate goroutine. - func (b *B) run() BenchmarkResult - - // runN runs a single benchmark for the specified number of ... - func (b *B) runN(n int) - - // trimOutput shortens the output from a benchmark, which can be ... - func (b *B) trimOutput() - - // The results of a benchmark run. - type BenchmarkResult struct { - N int // The number of iterations. - T time.Duration // The total time taken. - Bytes int64 // Bytes processed in one iteration. - } - - // Benchmark benchmarks a single function. Useful for creating ... - func Benchmark(f func(b *B)) BenchmarkResult - - // - func (r BenchmarkResult) NsPerOp() int64 - - // - func (r BenchmarkResult) String() string - - // - func (r BenchmarkResult) mbPerSec() float64 - - // An internal type but exported because it is cross-package; part ... - type InternalBenchmark struct { - Name string - F func(b *B) - } - - // - type InternalExample struct { - Name string - F func() - Output string - } - - // An internal type but exported because it is cross-package; part ... - type InternalTest struct { - Name string - F func(*T) - } - - // T is a type passed to Test functions to manage test state and ... - type T struct { - common - name string // Name of test. - startParallel chan bool // Parallel tests will wait on this. - } - - // Error is equivalent to Log() followed by Fail(). - func (c *T) Error(args ...any) - - // Errorf is equivalent to Logf() followed by Fail(). - func (c *T) Errorf(format string, args ...any) - - // Fail marks the function as having failed but continues ... - func (c *T) Fail() - - // FailNow marks the function as having failed and stops its ... - func (c *T) FailNow() - - // Failed reports whether the function has failed. - func (c *T) Failed() bool - - // Fatal is equivalent to Log() followed by FailNow(). - func (c *T) Fatal(args ...any) - - // Fatalf is equivalent to Logf() followed by FailNow(). - func (c *T) Fatalf(format string, args ...any) - - // Log formats its arguments using default formatting, analogous ... - func (c *T) Log(args ...any) - - // Logf formats its arguments according to the format, analogous ... - func (c *T) Logf(format string, args ...any) - - // Parallel signals that this test is to be run in parallel with ... - func (t *T) Parallel() - - // log generates the output. It's always at the same stack depth. - func (c *T) log(s string) - - // - func (t *T) report() - - // common holds the elements common between T and B and captures ... - type common struct { - output []byte // Output generated by test or benchmark. - failed bool // Test or benchmark has failed. - start time.Time // Time test or benchmark started - duration time.Duration - self any // To be sent on signal channel when done. - signal chan any // Output for serial tests. - } - - // Error is equivalent to Log() followed by Fail(). - func (c *common) Error(args ...any) - - // Errorf is equivalent to Logf() followed by Fail(). - func (c *common) Errorf(format string, args ...any) - - // Fail marks the function as having failed but continues ... - func (c *common) Fail() - - // FailNow marks the function as having failed and stops its ... - func (c *common) FailNow() - - // Failed reports whether the function has failed. - func (c *common) Failed() bool - - // Fatal is equivalent to Log() followed by FailNow(). - func (c *common) Fatal(args ...any) - - // Fatalf is equivalent to Logf() followed by FailNow(). - func (c *common) Fatalf(format string, args ...any) - - // Log formats its arguments using default formatting, analogous ... - func (c *common) Log(args ...any) - - // Logf formats its arguments according to the format, analogous ... - func (c *common) Logf(format string, args ...any) - - // log generates the output. It's always at the same stack depth. - func (c *common) log(s string) - diff --git a/internal/backport/go/doc/testdata/testing.2.golden b/internal/backport/go/doc/testdata/testing.2.golden deleted file mode 100644 index 61dac8bb66..0000000000 --- a/internal/backport/go/doc/testdata/testing.2.golden +++ /dev/null @@ -1,156 +0,0 @@ -// Package testing provides support for automated testing of Go ... -PACKAGE testing - -IMPORTPATH - testdata/testing - -IMPORTS - bytes - flag - fmt - io - os - runtime - runtime/pprof - strconv - strings - time - -FILENAMES - testdata/benchmark.go - testdata/example.go - testdata/testing.go - -FUNCTIONS - // An internal function but exported because it is cross-package; ... - func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) - - // An internal function but exported because it is cross-package; ... - func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark) - - // - func RunExamples(examples []InternalExample) (ok bool) - - // - func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) - - // Short reports whether the -test.short flag is set. - func Short() bool - - -TYPES - // B is a type passed to Benchmark functions to manage benchmark ... - type B struct { - N int - // contains filtered or unexported fields - } - - // Error is equivalent to Log() followed by Fail(). - func (c *B) Error(args ...any) - - // Errorf is equivalent to Logf() followed by Fail(). - func (c *B) Errorf(format string, args ...any) - - // Fail marks the function as having failed but continues ... - func (c *B) Fail() - - // FailNow marks the function as having failed and stops its ... - func (c *B) FailNow() - - // Failed reports whether the function has failed. - func (c *B) Failed() bool - - // Fatal is equivalent to Log() followed by FailNow(). - func (c *B) Fatal(args ...any) - - // Fatalf is equivalent to Logf() followed by FailNow(). - func (c *B) Fatalf(format string, args ...any) - - // Log formats its arguments using default formatting, analogous ... - func (c *B) Log(args ...any) - - // Logf formats its arguments according to the format, analogous ... - func (c *B) Logf(format string, args ...any) - - // ResetTimer sets the elapsed benchmark time to zero. It does not ... - func (b *B) ResetTimer() - - // SetBytes records the number of bytes processed in a single ... - func (b *B) SetBytes(n int64) - - // StartTimer starts timing a test. This function is called ... - func (b *B) StartTimer() - - // StopTimer stops timing a test. This can be used to pause the ... - func (b *B) StopTimer() - - // The results of a benchmark run. - type BenchmarkResult struct { - N int // The number of iterations. - T time.Duration // The total time taken. - Bytes int64 // Bytes processed in one iteration. - } - - // Benchmark benchmarks a single function. Useful for creating ... - func Benchmark(f func(b *B)) BenchmarkResult - - // - func (r BenchmarkResult) NsPerOp() int64 - - // - func (r BenchmarkResult) String() string - - // An internal type but exported because it is cross-package; part ... - type InternalBenchmark struct { - Name string - F func(b *B) - } - - // - type InternalExample struct { - Name string - F func() - Output string - } - - // An internal type but exported because it is cross-package; part ... - type InternalTest struct { - Name string - F func(*T) - } - - // T is a type passed to Test functions to manage test state and ... - type T struct { - // contains filtered or unexported fields - } - - // Error is equivalent to Log() followed by Fail(). - func (c *T) Error(args ...any) - - // Errorf is equivalent to Logf() followed by Fail(). - func (c *T) Errorf(format string, args ...any) - - // Fail marks the function as having failed but continues ... - func (c *T) Fail() - - // FailNow marks the function as having failed and stops its ... - func (c *T) FailNow() - - // Failed reports whether the function has failed. - func (c *T) Failed() bool - - // Fatal is equivalent to Log() followed by FailNow(). - func (c *T) Fatal(args ...any) - - // Fatalf is equivalent to Logf() followed by FailNow(). - func (c *T) Fatalf(format string, args ...any) - - // Log formats its arguments using default formatting, analogous ... - func (c *T) Log(args ...any) - - // Logf formats its arguments according to the format, analogous ... - func (c *T) Logf(format string, args ...any) - - // Parallel signals that this test is to be run in parallel with ... - func (t *T) Parallel() - diff --git a/internal/backport/go/doc/testdata/testing.go b/internal/backport/go/doc/testdata/testing.go deleted file mode 100644 index 6365ffceed..0000000000 --- a/internal/backport/go/doc/testdata/testing.go +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package testing provides support for automated testing of Go packages. -// It is intended to be used in concert with the “go test” utility, which automates -// execution of any function of the form -// func TestXxx(*testing.T) -// where Xxx can be any alphanumeric string (but the first letter must not be in -// [a-z]) and serves to identify the test routine. -// These TestXxx routines should be declared within the package they are testing. -// -// Functions of the form -// func BenchmarkXxx(*testing.B) -// are considered benchmarks, and are executed by go test when the -test.bench -// flag is provided. -// -// A sample benchmark function looks like this: -// func BenchmarkHello(b *testing.B) { -// for i := 0; i < b.N; i++ { -// fmt.Sprintf("hello") -// } -// } -// The benchmark package will vary b.N until the benchmark function lasts -// long enough to be timed reliably. The output -// testing.BenchmarkHello 10000000 282 ns/op -// means that the loop ran 10000000 times at a speed of 282 ns per loop. -// -// If a benchmark needs some expensive setup before running, the timer -// may be stopped: -// func BenchmarkBigLen(b *testing.B) { -// b.StopTimer() -// big := NewBig() -// b.StartTimer() -// for i := 0; i < b.N; i++ { -// big.Len() -// } -// } -package testing - -import ( - "flag" - "fmt" - "os" - "runtime" - "runtime/pprof" - "strconv" - "strings" - "time" -) - -var ( - // The short flag requests that tests run more quickly, but its functionality - // is provided by test writers themselves. The testing package is just its - // home. The all.bash installation script sets it to make installation more - // efficient, but by default the flag is off so a plain "go test" will do a - // full test of the package. - short = flag.Bool("test.short", false, "run smaller test suite to save time") - - // Report as tests are run; default is silent for success. - chatty = flag.Bool("test.v", false, "verbose: print additional output") - match = flag.String("test.run", "", "regular expression to select tests to run") - memProfile = flag.String("test.memprofile", "", "write a memory profile to the named file after execution") - memProfileRate = flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate") - cpuProfile = flag.String("test.cpuprofile", "", "write a cpu profile to the named file during execution") - timeout = flag.Duration("test.timeout", 0, "if positive, sets an aggregate time limit for all tests") - cpuListStr = flag.String("test.cpu", "", "comma-separated list of number of CPUs to use for each test") - parallel = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "maximum test parallelism") - - cpuList []int -) - -// common holds the elements common between T and B and -// captures common methods such as Errorf. -type common struct { - output []byte // Output generated by test or benchmark. - failed bool // Test or benchmark has failed. - start time.Time // Time test or benchmark started - duration time.Duration - self any // To be sent on signal channel when done. - signal chan any // Output for serial tests. -} - -// Short reports whether the -test.short flag is set. -func Short() bool { - return *short -} - -// decorate inserts the final newline if needed and indentation tabs for formatting. -// If addFileLine is true, it also prefixes the string with the file and line of the call site. -func decorate(s string, addFileLine bool) string { - if addFileLine { - _, file, line, ok := runtime.Caller(3) // decorate + log + public function. - if ok { - // Truncate file name at last file name separator. - if index := strings.LastIndex(file, "/"); index >= 0 { - file = file[index+1:] - } else if index = strings.LastIndex(file, "\\"); index >= 0 { - file = file[index+1:] - } - } else { - file = "???" - line = 1 - } - s = fmt.Sprintf("%s:%d: %s", file, line, s) - } - s = "\t" + s // Every line is indented at least one tab. - n := len(s) - if n > 0 && s[n-1] != '\n' { - s += "\n" - n++ - } - for i := 0; i < n-1; i++ { // -1 to avoid final newline - if s[i] == '\n' { - // Second and subsequent lines are indented an extra tab. - return s[0:i+1] + "\t" + decorate(s[i+1:n], false) - } - } - return s -} - -// T is a type passed to Test functions to manage test state and support formatted test logs. -// Logs are accumulated during execution and dumped to standard error when done. -type T struct { - common - name string // Name of test. - startParallel chan bool // Parallel tests will wait on this. -} - -// Fail marks the function as having failed but continues execution. -func (c *common) Fail() { c.failed = true } - -// Failed reports whether the function has failed. -func (c *common) Failed() bool { return c.failed } - -// FailNow marks the function as having failed and stops its execution. -// Execution will continue at the next Test. -func (c *common) FailNow() { - c.Fail() - - // Calling runtime.Goexit will exit the goroutine, which - // will run the deferred functions in this goroutine, - // which will eventually run the deferred lines in tRunner, - // which will signal to the test loop that this test is done. - // - // A previous version of this code said: - // - // c.duration = ... - // c.signal <- c.self - // runtime.Goexit() - // - // This previous version duplicated code (those lines are in - // tRunner no matter what), but worse the goroutine teardown - // implicit in runtime.Goexit was not guaranteed to complete - // before the test exited. If a test deferred an important cleanup - // function (like removing temporary files), there was no guarantee - // it would run on a test failure. Because we send on c.signal during - // a top-of-stack deferred function now, we know that the send - // only happens after any other stacked defers have completed. - runtime.Goexit() -} - -// log generates the output. It's always at the same stack depth. -func (c *common) log(s string) { - c.output = append(c.output, decorate(s, true)...) -} - -// Log formats its arguments using default formatting, analogous to Println(), -// and records the text in the error log. -func (c *common) Log(args ...any) { c.log(fmt.Sprintln(args...)) } - -// Logf formats its arguments according to the format, analogous to Printf(), -// and records the text in the error log. -func (c *common) Logf(format string, args ...any) { c.log(fmt.Sprintf(format, args...)) } - -// Error is equivalent to Log() followed by Fail(). -func (c *common) Error(args ...any) { - c.log(fmt.Sprintln(args...)) - c.Fail() -} - -// Errorf is equivalent to Logf() followed by Fail(). -func (c *common) Errorf(format string, args ...any) { - c.log(fmt.Sprintf(format, args...)) - c.Fail() -} - -// Fatal is equivalent to Log() followed by FailNow(). -func (c *common) Fatal(args ...any) { - c.log(fmt.Sprintln(args...)) - c.FailNow() -} - -// Fatalf is equivalent to Logf() followed by FailNow(). -func (c *common) Fatalf(format string, args ...any) { - c.log(fmt.Sprintf(format, args...)) - c.FailNow() -} - -// Parallel signals that this test is to be run in parallel with (and only with) -// other parallel tests in this CPU group. -func (t *T) Parallel() { - t.signal <- (*T)(nil) // Release main testing loop - <-t.startParallel // Wait for serial tests to finish -} - -// An internal type but exported because it is cross-package; part of the implementation -// of go test. -type InternalTest struct { - Name string - F func(*T) -} - -func tRunner(t *T, test *InternalTest) { - t.start = time.Now() - - // When this goroutine is done, either because test.F(t) - // returned normally or because a test failure triggered - // a call to runtime.Goexit, record the duration and send - // a signal saying that the test is done. - defer func() { - t.duration = time.Now().Sub(t.start) - t.signal <- t - }() - - test.F(t) -} - -// An internal function but exported because it is cross-package; part of the implementation -// of go test. -func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) { - flag.Parse() - parseCpuList() - - before() - startAlarm() - testOk := RunTests(matchString, tests) - exampleOk := RunExamples(examples) - if !testOk || !exampleOk { - fmt.Println("FAIL") - os.Exit(1) - } - fmt.Println("PASS") - stopAlarm() - RunBenchmarks(matchString, benchmarks) - after() -} - -func (t *T) report() { - tstr := fmt.Sprintf("(%.2f seconds)", t.duration.Seconds()) - format := "--- %s: %s %s\n%s" - if t.failed { - fmt.Printf(format, "FAIL", t.name, tstr, t.output) - } else if *chatty { - fmt.Printf(format, "PASS", t.name, tstr, t.output) - } -} - -func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) { - ok = true - if len(tests) == 0 { - fmt.Fprintln(os.Stderr, "testing: warning: no tests to run") - return - } - for _, procs := range cpuList { - runtime.GOMAXPROCS(procs) - // We build a new channel tree for each run of the loop. - // collector merges in one channel all the upstream signals from parallel tests. - // If all tests pump to the same channel, a bug can occur where a test - // kicks off a goroutine that Fails, yet the test still delivers a completion signal, - // which skews the counting. - var collector = make(chan any) - - numParallel := 0 - startParallel := make(chan bool) - - for i := 0; i < len(tests); i++ { - matched, err := matchString(*match, tests[i].Name) - if err != nil { - fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.run: %s\n", err) - os.Exit(1) - } - if !matched { - continue - } - testName := tests[i].Name - if procs != 1 { - testName = fmt.Sprintf("%s-%d", tests[i].Name, procs) - } - t := &T{ - common: common{ - signal: make(chan any), - }, - name: testName, - startParallel: startParallel, - } - t.self = t - if *chatty { - fmt.Printf("=== RUN %s\n", t.name) - } - go tRunner(t, &tests[i]) - out := (<-t.signal).(*T) - if out == nil { // Parallel run. - go func() { - collector <- <-t.signal - }() - numParallel++ - continue - } - t.report() - ok = ok && !out.failed - } - - running := 0 - for numParallel+running > 0 { - if running < *parallel && numParallel > 0 { - startParallel <- true - running++ - numParallel-- - continue - } - t := (<-collector).(*T) - t.report() - ok = ok && !t.failed - running-- - } - } - return -} - -// before runs before all testing. -func before() { - if *memProfileRate > 0 { - runtime.MemProfileRate = *memProfileRate - } - if *cpuProfile != "" { - f, err := os.Create(*cpuProfile) - if err != nil { - fmt.Fprintf(os.Stderr, "testing: %s", err) - return - } - if err := pprof.StartCPUProfile(f); err != nil { - fmt.Fprintf(os.Stderr, "testing: can't start cpu profile: %s", err) - f.Close() - return - } - // Could save f so after can call f.Close; not worth the effort. - } - -} - -// after runs after all testing. -func after() { - if *cpuProfile != "" { - pprof.StopCPUProfile() // flushes profile to disk - } - if *memProfile != "" { - f, err := os.Create(*memProfile) - if err != nil { - fmt.Fprintf(os.Stderr, "testing: %s", err) - return - } - if err = pprof.WriteHeapProfile(f); err != nil { - fmt.Fprintf(os.Stderr, "testing: can't write %s: %s", *memProfile, err) - } - f.Close() - } -} - -var timer *time.Timer - -// startAlarm starts an alarm if requested. -func startAlarm() { - if *timeout > 0 { - timer = time.AfterFunc(*timeout, alarm) - } -} - -// stopAlarm turns off the alarm. -func stopAlarm() { - if *timeout > 0 { - timer.Stop() - } -} - -// alarm is called if the timeout expires. -func alarm() { - panic("test timed out") -} - -func parseCpuList() { - if len(*cpuListStr) == 0 { - cpuList = append(cpuList, runtime.GOMAXPROCS(-1)) - } else { - for _, val := range strings.Split(*cpuListStr, ",") { - cpu, err := strconv.Atoi(val) - if err != nil || cpu <= 0 { - fmt.Fprintf(os.Stderr, "testing: invalid value %q for -test.cpu", val) - os.Exit(1) - } - cpuList = append(cpuList, cpu) - } - } -} diff --git a/internal/backport/go/format/benchmark_test.go b/internal/backport/go/format/benchmark_test.go deleted file mode 100644 index e2a6491d67..0000000000 --- a/internal/backport/go/format/benchmark_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file provides a simple framework to add benchmarks -// based on generated input (source) files. - -package format_test - -import ( - "bytes" - "flag" - "fmt" - "golang.org/x/website/internal/backport/go/format" - "os" - "testing" -) - -var debug = flag.Bool("debug", false, "write .src files containing formatting input; for debugging") - -// array1 generates an array literal with n elements of the form: -// -// var _ = [...]byte{ -// -// // 0 -// 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, -// 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, -// 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, -// 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, -// 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, -// // 40 -// 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, -// 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, -// ... -func array1(buf *bytes.Buffer, n int) { - buf.WriteString("var _ = [...]byte{\n") - for i := 0; i < n; { - if i%10 == 0 { - fmt.Fprintf(buf, "\t// %d\n", i) - } - buf.WriteByte('\t') - for j := 0; j < 8; j++ { - fmt.Fprintf(buf, "0x%02x, ", byte(i)) - i++ - } - buf.WriteString("\n") - } - buf.WriteString("}\n") -} - -var tests = []struct { - name string - gen func(*bytes.Buffer, int) - n int -}{ - {"array1", array1, 10000}, - // add new test cases here as needed -} - -func BenchmarkFormat(b *testing.B) { - var src bytes.Buffer - for _, t := range tests { - src.Reset() - src.WriteString("package p\n") - t.gen(&src, t.n) - data := src.Bytes() - - if *debug { - filename := t.name + ".src" - err := os.WriteFile(filename, data, 0660) - if err != nil { - b.Fatalf("couldn't write %s: %v", filename, err) - } - } - - b.Run(fmt.Sprintf("%s-%d", t.name, t.n), func(b *testing.B) { - b.SetBytes(int64(len(data))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - var err error - sink, err = format.Source(data) - if err != nil { - b.Fatal(err) - } - } - }) - } -} - -var sink []byte diff --git a/internal/backport/go/format/example_test.go b/internal/backport/go/format/example_test.go deleted file mode 100644 index 5e7ceee6d3..0000000000 --- a/internal/backport/go/format/example_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package format_test - -import ( - "bytes" - "fmt" - "golang.org/x/website/internal/backport/go/format" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" - "log" -) - -func ExampleNode() { - const expr = "(6+2*3)/4" - - // parser.ParseExpr parses the argument and returns the - // corresponding ast.Node. - node, err := parser.ParseExpr(expr) - if err != nil { - log.Fatal(err) - } - - // Create a FileSet for node. Since the node does not come - // from a real source file, fset will be empty. - fset := token.NewFileSet() - - var buf bytes.Buffer - err = format.Node(&buf, fset, node) - if err != nil { - log.Fatal(err) - } - - fmt.Println(buf.String()) - - // Output: (6 + 2*3) / 4 -} diff --git a/internal/backport/go/format/format.go b/internal/backport/go/format/format.go deleted file mode 100644 index 7d1804c66b..0000000000 --- a/internal/backport/go/format/format.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package format implements standard formatting of Go source. -// -// Note that formatting of Go source code changes over time, so tools relying on -// consistent formatting should execute a specific version of the gofmt binary -// instead of using this package. That way, the formatting will be stable, and -// the tools won't need to be recompiled each time gofmt changes. -// -// For example, pre-submit checks that use this package directly would behave -// differently depending on what Go version each developer uses, causing the -// check to be inherently fragile. -package format - -import ( - "bytes" - "fmt" - "io" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/printer" - "golang.org/x/website/internal/backport/go/token" -) - -// Keep these in sync with cmd/gofmt/gofmt.go. -const ( - tabWidth = 8 - printerMode = printer.UseSpaces | printer.TabIndent | printerNormalizeNumbers - - // printerNormalizeNumbers means to canonicalize number literal prefixes - // and exponents while printing. See https://golang.org/doc/go1.13#gofmt. - // - // This value is defined in go/printer specifically for go/format and cmd/gofmt. - printerNormalizeNumbers = 1 << 30 -) - -var config = printer.Config{Mode: printerMode, Tabwidth: tabWidth} - -const parserMode = parser.ParseComments | parser.SkipObjectResolution - -// Node formats node in canonical gofmt style and writes the result to dst. -// -// The node type must be *ast.File, *printer.CommentedNode, []ast.Decl, -// []ast.Stmt, or assignment-compatible to ast.Expr, ast.Decl, ast.Spec, -// or ast.Stmt. Node does not modify node. Imports are not sorted for -// nodes representing partial source files (for instance, if the node is -// not an *ast.File or a *printer.CommentedNode not wrapping an *ast.File). -// -// The function may return early (before the entire result is written) -// and return a formatting error, for instance due to an incorrect AST. -func Node(dst io.Writer, fset *token.FileSet, node interface{}) error { - // Determine if we have a complete source file (file != nil). - var file *ast.File - var cnode *printer.CommentedNode - switch n := node.(type) { - case *ast.File: - file = n - case *printer.CommentedNode: - if f, ok := n.Node.(*ast.File); ok { - file = f - cnode = n - } - } - - // Sort imports if necessary. - if file != nil && hasUnsortedImports(file) { - // Make a copy of the AST because ast.SortImports is destructive. - // TODO(gri) Do this more efficiently. - var buf bytes.Buffer - err := config.Fprint(&buf, fset, file) - if err != nil { - return err - } - file, err = parser.ParseFile(fset, "", buf.Bytes(), parserMode) - if err != nil { - // We should never get here. If we do, provide good diagnostic. - return fmt.Errorf("format.Node internal error (%s)", err) - } - ast.SortImports(fset, file) - - // Use new file with sorted imports. - node = file - if cnode != nil { - node = &printer.CommentedNode{Node: file, Comments: cnode.Comments} - } - } - - return config.Fprint(dst, fset, node) -} - -// Source formats src in canonical gofmt style and returns the result -// or an (I/O or syntax) error. src is expected to be a syntactically -// correct Go source file, or a list of Go declarations or statements. -// -// If src is a partial source file, the leading and trailing space of src -// is applied to the result (such that it has the same leading and trailing -// space as src), and the result is indented by the same amount as the first -// line of src containing code. Imports are not sorted for partial source files. -func Source(src []byte) ([]byte, error) { - fset := token.NewFileSet() - file, sourceAdj, indentAdj, err := parse(fset, "", src, true) - if err != nil { - return nil, err - } - - if sourceAdj == nil { - // Complete source file. - // TODO(gri) consider doing this always. - ast.SortImports(fset, file) - } - - return format(fset, file, sourceAdj, indentAdj, src, config) -} - -func hasUnsortedImports(file *ast.File) bool { - for _, d := range file.Decls { - d, ok := d.(*ast.GenDecl) - if !ok || d.Tok != token.IMPORT { - // Not an import declaration, so we're done. - // Imports are always first. - return false - } - if d.Lparen.IsValid() { - // For now assume all grouped imports are unsorted. - // TODO(gri) Should check if they are sorted already. - return true - } - // Ungrouped imports are sorted by default. - } - return false -} diff --git a/internal/backport/go/format/format_test.go b/internal/backport/go/format/format_test.go deleted file mode 100644 index 59730a9872..0000000000 --- a/internal/backport/go/format/format_test.go +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package format - -import ( - "bytes" - "os" - "strings" - "testing" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -const testfile = "format_test.go" - -func diff(t *testing.T, dst, src []byte) { - line := 1 - offs := 0 // line offset - for i := 0; i < len(dst) && i < len(src); i++ { - d := dst[i] - s := src[i] - if d != s { - t.Errorf("dst:%d: %s\n", line, dst[offs:i+1]) - t.Errorf("src:%d: %s\n", line, src[offs:i+1]) - return - } - if s == '\n' { - line++ - offs = i + 1 - } - } - if len(dst) != len(src) { - t.Errorf("len(dst) = %d, len(src) = %d\nsrc = %q", len(dst), len(src), src) - } -} - -func TestNode(t *testing.T) { - src, err := os.ReadFile(testfile) - if err != nil { - t.Fatal(err) - } - - fset := token.NewFileSet() - file, err := parser.ParseFile(fset, testfile, src, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - - var buf bytes.Buffer - - if err = Node(&buf, fset, file); err != nil { - t.Fatal("Node failed:", err) - } - - diff(t, buf.Bytes(), src) -} - -// Node is documented to not modify the AST. -// Test that it is so even when numbers are normalized. -func TestNodeNoModify(t *testing.T) { - const ( - src = "package p\n\nconst _ = 0000000123i\n" - golden = "package p\n\nconst _ = 123i\n" - ) - - fset := token.NewFileSet() - file, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - - // Capture original address and value of a BasicLit node - // which will undergo formatting changes during printing. - wantLit := file.Decls[0].(*ast.GenDecl).Specs[0].(*ast.ValueSpec).Values[0].(*ast.BasicLit) - wantVal := wantLit.Value - - var buf bytes.Buffer - if err = Node(&buf, fset, file); err != nil { - t.Fatal("Node failed:", err) - } - diff(t, buf.Bytes(), []byte(golden)) - - // Check if anything changed after Node returned. - gotLit := file.Decls[0].(*ast.GenDecl).Specs[0].(*ast.ValueSpec).Values[0].(*ast.BasicLit) - gotVal := gotLit.Value - - if gotLit != wantLit { - t.Errorf("got *ast.BasicLit address %p, want %p", gotLit, wantLit) - } - if gotVal != wantVal { - t.Errorf("got *ast.BasicLit value %q, want %q", gotVal, wantVal) - } -} - -func TestSource(t *testing.T) { - src, err := os.ReadFile(testfile) - if err != nil { - t.Fatal(err) - } - - res, err := Source(src) - if err != nil { - t.Fatal("Source failed:", err) - } - - diff(t, res, src) -} - -// Test cases that are expected to fail are marked by the prefix "ERROR". -// The formatted result must look the same as the input for successful tests. -var tests = []string{ - // declaration lists - `import "golang.org/x/website/internal/backport/go/format"`, - "var x int", - "var x int\n\ntype T struct{}", - - // statement lists - "x := 0", - "f(a, b, c)\nvar x int = f(1, 2, 3)", - - // indentation, leading and trailing space - "\tx := 0\n\tgo f()", - "\tx := 0\n\tgo f()\n\n\n", - "\n\t\t\n\n\tx := 0\n\tgo f()\n\n\n", - "\n\t\t\n\n\t\t\tx := 0\n\t\t\tgo f()\n\n\n", - "\n\t\t\n\n\t\t\tx := 0\n\t\t\tconst s = `\nfoo\n`\n\n\n", // no indentation added inside raw strings - "\n\t\t\n\n\t\t\tx := 0\n\t\t\tconst s = `\n\t\tfoo\n`\n\n\n", // no indentation removed inside raw strings - - // comments - "/* Comment */", - "\t/* Comment */ ", - "\n/* Comment */ ", - "i := 5 /* Comment */", // issue #5551 - "\ta()\n//line :1", // issue #11276 - "\t//xxx\n\ta()\n//line :2", // issue #11276 - "\ta() //line :1\n\tb()\n", // issue #11276 - "x := 0\n//line :1\n//line :2", // issue #11276 - - // whitespace - "", // issue #11275 - " ", // issue #11275 - "\t", // issue #11275 - "\t\t", // issue #11275 - "\n", // issue #11275 - "\n\n", // issue #11275 - "\t\n", // issue #11275 - - // erroneous programs - "ERROR1 + 2 +", - "ERRORx := 0", - - // build comments - "// copyright\n\n//go:build x\n\npackage p\n", - "// copyright\n\n//go:build x\n// +build x\n\npackage p\n", -} - -func String(s string) (string, error) { - res, err := Source([]byte(s)) - if err != nil { - return "", err - } - return string(res), nil -} - -func TestPartial(t *testing.T) { - for _, src := range tests { - if strings.HasPrefix(src, "ERROR") { - // test expected to fail - src = src[5:] // remove ERROR prefix - res, err := String(src) - if err == nil && res == src { - t.Errorf("formatting succeeded but was expected to fail:\n%q", src) - } - } else { - // test expected to succeed - res, err := String(src) - if err != nil { - t.Errorf("formatting failed (%s):\n%q", err, src) - } else if res != src { - t.Errorf("formatting incorrect:\nsource: %q\nresult: %q", src, res) - } - } - } -} diff --git a/internal/backport/go/format/internal.go b/internal/backport/go/format/internal.go deleted file mode 100644 index c83432d799..0000000000 --- a/internal/backport/go/format/internal.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// TODO(gri): This file and the file src/cmd/gofmt/internal.go are -// the same (but for this comment and the package name). Do not modify -// one without the other. Determine if we can factor out functionality -// in a public API. See also #11844 for context. - -package format - -import ( - "bytes" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/printer" - "golang.org/x/website/internal/backport/go/token" - "strings" -) - -// parse parses src, which was read from the named file, -// as a Go source file, declaration, or statement list. -func parse(fset *token.FileSet, filename string, src []byte, fragmentOk bool) ( - file *ast.File, - sourceAdj func(src []byte, indent int) []byte, - indentAdj int, - err error, -) { - // Try as whole source file. - file, err = parser.ParseFile(fset, filename, src, parserMode) - // If there's no error, return. If the error is that the source file didn't begin with a - // package line and source fragments are ok, fall through to - // try as a source fragment. Stop and return on any other error. - if err == nil || !fragmentOk || !strings.Contains(err.Error(), "expected 'package'") { - return - } - - // If this is a declaration list, make it a source file - // by inserting a package clause. - // Insert using a ';', not a newline, so that the line numbers - // in psrc match the ones in src. - psrc := append([]byte("package p;"), src...) - file, err = parser.ParseFile(fset, filename, psrc, parserMode) - if err == nil { - sourceAdj = func(src []byte, indent int) []byte { - // Remove the package clause. - // Gofmt has turned the ';' into a '\n'. - src = src[indent+len("package p\n"):] - return bytes.TrimSpace(src) - } - return - } - // If the error is that the source file didn't begin with a - // declaration, fall through to try as a statement list. - // Stop and return on any other error. - if !strings.Contains(err.Error(), "expected declaration") { - return - } - - // If this is a statement list, make it a source file - // by inserting a package clause and turning the list - // into a function body. This handles expressions too. - // Insert using a ';', not a newline, so that the line numbers - // in fsrc match the ones in src. Add an extra '\n' before the '}' - // to make sure comments are flushed before the '}'. - fsrc := append(append([]byte("package p; func _() {"), src...), '\n', '\n', '}') - file, err = parser.ParseFile(fset, filename, fsrc, parserMode) - if err == nil { - sourceAdj = func(src []byte, indent int) []byte { - // Cap adjusted indent to zero. - if indent < 0 { - indent = 0 - } - // Remove the wrapping. - // Gofmt has turned the "; " into a "\n\n". - // There will be two non-blank lines with indent, hence 2*indent. - src = src[2*indent+len("package p\n\nfunc _() {"):] - // Remove only the "}\n" suffix: remaining whitespaces will be trimmed anyway - src = src[:len(src)-len("}\n")] - return bytes.TrimSpace(src) - } - // Gofmt has also indented the function body one level. - // Adjust that with indentAdj. - indentAdj = -1 - } - - // Succeeded, or out of options. - return -} - -// format formats the given package file originally obtained from src -// and adjusts the result based on the original source via sourceAdj -// and indentAdj. -func format( - fset *token.FileSet, - file *ast.File, - sourceAdj func(src []byte, indent int) []byte, - indentAdj int, - src []byte, - cfg printer.Config, -) ([]byte, error) { - if sourceAdj == nil { - // Complete source file. - var buf bytes.Buffer - err := cfg.Fprint(&buf, fset, file) - if err != nil { - return nil, err - } - return buf.Bytes(), nil - } - - // Partial source file. - // Determine and prepend leading space. - i, j := 0, 0 - for j < len(src) && isSpace(src[j]) { - if src[j] == '\n' { - i = j + 1 // byte offset of last line in leading space - } - j++ - } - var res []byte - res = append(res, src[:i]...) - - // Determine and prepend indentation of first code line. - // Spaces are ignored unless there are no tabs, - // in which case spaces count as one tab. - indent := 0 - hasSpace := false - for _, b := range src[i:j] { - switch b { - case ' ': - hasSpace = true - case '\t': - indent++ - } - } - if indent == 0 && hasSpace { - indent = 1 - } - for i := 0; i < indent; i++ { - res = append(res, '\t') - } - - // Format the source. - // Write it without any leading and trailing space. - cfg.Indent = indent + indentAdj - var buf bytes.Buffer - err := cfg.Fprint(&buf, fset, file) - if err != nil { - return nil, err - } - out := sourceAdj(buf.Bytes(), cfg.Indent) - - // If the adjusted output is empty, the source - // was empty but (possibly) for white space. - // The result is the incoming source. - if len(out) == 0 { - return src, nil - } - - // Otherwise, append output to leading space. - res = append(res, out...) - - // Determine and append trailing space. - i = len(src) - for i > 0 && isSpace(src[i-1]) { - i-- - } - return append(res, src[i:]...), nil -} - -// isSpace reports whether the byte is a space character. -// isSpace defines a space as being among the following bytes: ' ', '\t', '\n' and '\r'. -func isSpace(b byte) bool { - return b == ' ' || b == '\t' || b == '\n' || b == '\r' -} diff --git a/internal/backport/go/internal/typeparams/common.go b/internal/backport/go/internal/typeparams/common.go deleted file mode 100644 index 9b82e6061a..0000000000 --- a/internal/backport/go/internal/typeparams/common.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package typeparams provides functions to work with type parameter data -// stored in the AST, while these AST changes are guarded by a build -// constraint. -package typeparams - -// 'Hidden' parser modes to control the parsing of type-parameter related -// features. -const ( - DisallowTypeSets = 1 << 29 // Disallow eliding 'interface' in constraint type sets. - DisallowParsing = 1 << 30 // Disallow type parameters entirely. -) diff --git a/internal/backport/go/internal/typeparams/typeparams.go b/internal/backport/go/internal/typeparams/typeparams.go deleted file mode 100644 index 2f7a5ce210..0000000000 --- a/internal/backport/go/internal/typeparams/typeparams.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typeparams - -import ( - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" -) - -func PackIndexExpr(x ast.Expr, lbrack token.Pos, exprs []ast.Expr, rbrack token.Pos) ast.Expr { - switch len(exprs) { - case 0: - panic("internal error: PackIndexExpr with empty expr slice") - case 1: - return &ast.IndexExpr{ - X: x, - Lbrack: lbrack, - Index: exprs[0], - Rbrack: rbrack, - } - default: - return &ast.IndexListExpr{ - X: x, - Lbrack: lbrack, - Indices: exprs, - Rbrack: rbrack, - } - } -} - -// IndexExpr wraps an ast.IndexExpr or ast.IndexListExpr. -// -// Orig holds the original ast.Expr from which this IndexExpr was derived. -type IndexExpr struct { - Orig ast.Expr // the wrapped expr, which may be distinct from the IndexListExpr below. - *ast.IndexListExpr -} - -func UnpackIndexExpr(n ast.Node) *IndexExpr { - switch e := n.(type) { - case *ast.IndexExpr: - return &IndexExpr{e, &ast.IndexListExpr{ - X: e.X, - Lbrack: e.Lbrack, - Indices: []ast.Expr{e.Index}, - Rbrack: e.Rbrack, - }} - case *ast.IndexListExpr: - return &IndexExpr{e, e} - } - return nil -} diff --git a/internal/backport/go/parser/error_test.go b/internal/backport/go/parser/error_test.go deleted file mode 100644 index 38658c2434..0000000000 --- a/internal/backport/go/parser/error_test.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements a parser test harness. The files in the testdata -// directory are parsed and the errors reported are compared against the -// error messages expected in the test files. The test files must end in -// .src rather than .go so that they are not disturbed by gofmt runs. -// -// Expected errors are indicated in the test files by putting a comment -// of the form /* ERROR "rx" */ immediately following an offending token. -// The harness will verify that an error matching the regular expression -// rx is reported at that source position. -// -// For instance, the following test file indicates that a "not declared" -// error should be reported for the undeclared variable x: -// -// package p -// func f() { -// _ = x /* ERROR "not declared" */ + 1 -// } - -package parser - -import ( - "flag" - "golang.org/x/website/internal/backport/go/internal/typeparams" - "golang.org/x/website/internal/backport/go/scanner" - "golang.org/x/website/internal/backport/go/token" - "os" - "path/filepath" - "regexp" - "strings" - "testing" -) - -var traceErrs = flag.Bool("trace_errs", false, "whether to enable tracing for error tests") - -const testdata = "testdata" - -// getFile assumes that each filename occurs at most once -func getFile(fset *token.FileSet, filename string) (file *token.File) { - fset.Iterate(func(f *token.File) bool { - if f.Name() == filename { - if file != nil { - panic(filename + " used multiple times") - } - file = f - } - return true - }) - return file -} - -func getPos(fset *token.FileSet, filename string, offset int) token.Pos { - if f := getFile(fset, filename); f != nil { - return f.Pos(offset) - } - return token.NoPos -} - -// ERROR comments must be of the form /* ERROR "rx" */ and rx is -// a regular expression that matches the expected error message. -// The special form /* ERROR HERE "rx" */ must be used for error -// messages that appear immediately after a token, rather than at -// a token's position. -var errRx = regexp.MustCompile(`^/\* *ERROR *(HERE)? *"([^"]*)" *\*/$`) - -// expectedErrors collects the regular expressions of ERROR comments found -// in files and returns them as a map of error positions to error messages. -func expectedErrors(fset *token.FileSet, filename string, src []byte) map[token.Pos]string { - errors := make(map[token.Pos]string) - - var s scanner.Scanner - // file was parsed already - do not add it again to the file - // set otherwise the position information returned here will - // not match the position information collected by the parser - s.Init(getFile(fset, filename), src, nil, scanner.ScanComments) - var prev token.Pos // position of last non-comment, non-semicolon token - var here token.Pos // position immediately after the token at position prev - - for { - pos, tok, lit := s.Scan() - switch tok { - case token.EOF: - return errors - case token.COMMENT: - s := errRx.FindStringSubmatch(lit) - if len(s) == 3 { - pos := prev - if s[1] == "HERE" { - pos = here - } - errors[pos] = s[2] - } - case token.SEMICOLON: - // don't use the position of auto-inserted (invisible) semicolons - if lit != ";" { - break - } - fallthrough - default: - prev = pos - var l int // token length - if tok.IsLiteral() { - l = len(lit) - } else { - l = len(tok.String()) - } - here = prev + token.Pos(l) - } - } -} - -// compareErrors compares the map of expected error messages with the list -// of found errors and reports discrepancies. -func compareErrors(t *testing.T, fset *token.FileSet, expected map[token.Pos]string, found scanner.ErrorList) { - t.Helper() - for _, error := range found { - // error.Pos is a token.Position, but we want - // a token.Pos so we can do a map lookup - pos := getPos(fset, error.Pos.Filename, error.Pos.Offset) - if msg, found := expected[pos]; found { - // we expect a message at pos; check if it matches - rx, err := regexp.Compile(msg) - if err != nil { - t.Errorf("%s: %v", error.Pos, err) - continue - } - if match := rx.MatchString(error.Msg); !match { - t.Errorf("%s: %q does not match %q", error.Pos, error.Msg, msg) - continue - } - // we have a match - eliminate this error - delete(expected, pos) - } else { - // To keep in mind when analyzing failed test output: - // If the same error position occurs multiple times in errors, - // this message will be triggered (because the first error at - // the position removes this position from the expected errors). - t.Errorf("%s: unexpected error: %s", error.Pos, error.Msg) - } - } - - // there should be no expected errors left - if len(expected) > 0 { - t.Errorf("%d errors not reported:", len(expected)) - for pos, msg := range expected { - t.Errorf("%s: %s\n", fset.Position(pos), msg) - } - } -} - -func checkErrors(t *testing.T, filename string, input interface{}, mode Mode, expectErrors bool) { - t.Helper() - src, err := readSource(filename, input) - if err != nil { - t.Error(err) - return - } - - fset := token.NewFileSet() - _, err = ParseFile(fset, filename, src, mode) - found, ok := err.(scanner.ErrorList) - if err != nil && !ok { - t.Error(err) - return - } - found.RemoveMultiples() - - expected := map[token.Pos]string{} - if expectErrors { - // we are expecting the following errors - // (collect these after parsing a file so that it is found in the file set) - expected = expectedErrors(fset, filename, src) - } - - // verify errors returned by the parser - compareErrors(t, fset, expected, found) -} - -func TestErrors(t *testing.T) { - list, err := os.ReadDir(testdata) - if err != nil { - t.Fatal(err) - } - for _, d := range list { - name := d.Name() - t.Run(name, func(t *testing.T) { - if !d.IsDir() && !strings.HasPrefix(name, ".") && (strings.HasSuffix(name, ".src") || strings.HasSuffix(name, ".go2")) { - mode := DeclarationErrors | AllErrors - if !strings.HasSuffix(name, ".go2") { - mode |= typeparams.DisallowParsing - } - if *traceErrs { - mode |= Trace - } - checkErrors(t, filepath.Join(testdata, name), nil, mode, true) - } - }) - } -} diff --git a/internal/backport/go/parser/example_test.go b/internal/backport/go/parser/example_test.go deleted file mode 100644 index 35fdd33500..0000000000 --- a/internal/backport/go/parser/example_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package parser_test - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -func ExampleParseFile() { - fset := token.NewFileSet() // positions are relative to fset - - src := `package foo - -import ( - "fmt" - "time" -) - -func bar() { - fmt.Println(time.Now()) -}` - - // Parse src but stop after processing the imports. - f, err := parser.ParseFile(fset, "", src, parser.ImportsOnly) - if err != nil { - fmt.Println(err) - return - } - - // Print the imports from the file's AST. - for _, s := range f.Imports { - fmt.Println(s.Path.Value) - } - - // output: - // - // "fmt" - // "time" -} diff --git a/internal/backport/go/parser/interface.go b/internal/backport/go/parser/interface.go deleted file mode 100644 index e253539e52..0000000000 --- a/internal/backport/go/parser/interface.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the exported entry points for invoking the parser. - -package parser - -import ( - "bytes" - "errors" - "io" - "io/fs" - "os" - "path/filepath" - "strings" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" -) - -// If src != nil, readSource converts src to a []byte if possible; -// otherwise it returns an error. If src == nil, readSource returns -// the result of reading the file specified by filename. -func readSource(filename string, src interface{}) ([]byte, error) { - if src != nil { - switch s := src.(type) { - case string: - return []byte(s), nil - case []byte: - return s, nil - case *bytes.Buffer: - // is io.Reader, but src is already available in []byte form - if s != nil { - return s.Bytes(), nil - } - case io.Reader: - return io.ReadAll(s) - } - return nil, errors.New("invalid source") - } - return os.ReadFile(filename) -} - -// A Mode value is a set of flags (or 0). -// They control the amount of source code parsed and other optional -// parser functionality. -type Mode uint - -const ( - PackageClauseOnly Mode = 1 << iota // stop parsing after package clause - ImportsOnly // stop parsing after import declarations - ParseComments // parse comments and add them to AST - Trace // print a trace of parsed productions - DeclarationErrors // report declaration errors - SpuriousErrors // same as AllErrors, for backward-compatibility - SkipObjectResolution // don't resolve identifiers to objects - see ParseFile - AllErrors = SpuriousErrors // report all errors (not just the first 10 on different lines) -) - -// ParseFile parses the source code of a single Go source file and returns -// the corresponding ast.File node. The source code may be provided via -// the filename of the source file, or via the src parameter. -// -// If src != nil, ParseFile parses the source from src and the filename is -// only used when recording position information. The type of the argument -// for the src parameter must be string, []byte, or io.Reader. -// If src == nil, ParseFile parses the file specified by filename. -// -// The mode parameter controls the amount of source text parsed and other -// optional parser functionality. If the SkipObjectResolution mode bit is set, -// the object resolution phase of parsing will be skipped, causing File.Scope, -// File.Unresolved, and all Ident.Obj fields to be nil. -// -// Position information is recorded in the file set fset, which must not be -// nil. -// -// If the source couldn't be read, the returned AST is nil and the error -// indicates the specific failure. If the source was read but syntax -// errors were found, the result is a partial AST (with ast.Bad* nodes -// representing the fragments of erroneous source code). Multiple errors -// are returned via a scanner.ErrorList which is sorted by source position. -func ParseFile(fset *token.FileSet, filename string, src interface{}, mode Mode) (f *ast.File, err error) { - if fset == nil { - panic("parser.ParseFile: no token.FileSet provided (fset == nil)") - } - - // get source - text, err := readSource(filename, src) - if err != nil { - return nil, err - } - - var p parser - defer func() { - if e := recover(); e != nil { - // resume same panic if it's not a bailout - bail, ok := e.(bailout) - if !ok { - panic(e) - } else if bail.msg != "" { - p.errors.Add(p.file.Position(bail.pos), bail.msg) - } - } - - // set result values - if f == nil { - // source is not a valid Go source file - satisfy - // ParseFile API and return a valid (but) empty - // *ast.File - f = &ast.File{ - Name: new(ast.Ident), - Scope: ast.NewScope(nil), - } - } - - p.errors.Sort() - err = p.errors.Err() - }() - - // parse source - p.init(fset, filename, text, mode) - f = p.parseFile() - - return -} - -// ParseDir calls ParseFile for all files with names ending in ".go" in the -// directory specified by path and returns a map of package name -> package -// AST with all the packages found. -// -// If filter != nil, only the files with fs.FileInfo entries passing through -// the filter (and ending in ".go") are considered. The mode bits are passed -// to ParseFile unchanged. Position information is recorded in fset, which -// must not be nil. -// -// If the directory couldn't be read, a nil map and the respective error are -// returned. If a parse error occurred, a non-nil but incomplete map and the -// first error encountered are returned. -func ParseDir(fset *token.FileSet, path string, filter func(fs.FileInfo) bool, mode Mode) (pkgs map[string]*ast.Package, first error) { - list, err := os.ReadDir(path) - if err != nil { - return nil, err - } - - pkgs = make(map[string]*ast.Package) - for _, d := range list { - if d.IsDir() || !strings.HasSuffix(d.Name(), ".go") { - continue - } - if filter != nil { - info, err := d.Info() - if err != nil { - return nil, err - } - if !filter(info) { - continue - } - } - filename := filepath.Join(path, d.Name()) - if src, err := ParseFile(fset, filename, nil, mode); err == nil { - name := src.Name.Name - pkg, found := pkgs[name] - if !found { - pkg = &ast.Package{ - Name: name, - Files: make(map[string]*ast.File), - } - pkgs[name] = pkg - } - pkg.Files[filename] = src - } else if first == nil { - first = err - } - } - - return -} - -// ParseExprFrom is a convenience function for parsing an expression. -// The arguments have the same meaning as for ParseFile, but the source must -// be a valid Go (type or value) expression. Specifically, fset must not -// be nil. -// -// If the source couldn't be read, the returned AST is nil and the error -// indicates the specific failure. If the source was read but syntax -// errors were found, the result is a partial AST (with ast.Bad* nodes -// representing the fragments of erroneous source code). Multiple errors -// are returned via a scanner.ErrorList which is sorted by source position. -func ParseExprFrom(fset *token.FileSet, filename string, src interface{}, mode Mode) (expr ast.Expr, err error) { - if fset == nil { - panic("parser.ParseExprFrom: no token.FileSet provided (fset == nil)") - } - - // get source - text, err := readSource(filename, src) - if err != nil { - return nil, err - } - - var p parser - defer func() { - if e := recover(); e != nil { - // resume same panic if it's not a bailout - bail, ok := e.(bailout) - if !ok { - panic(e) - } else if bail.msg != "" { - p.errors.Add(p.file.Position(bail.pos), bail.msg) - } - } - p.errors.Sort() - err = p.errors.Err() - }() - - // parse expr - p.init(fset, filename, text, mode) - expr = p.parseRhsOrType() - - // If a semicolon was inserted, consume it; - // report an error if there's more tokens. - if p.tok == token.SEMICOLON && p.lit == "\n" { - p.next() - } - p.expect(token.EOF) - - return -} - -// ParseExpr is a convenience function for obtaining the AST of an expression x. -// The position information recorded in the AST is undefined. The filename used -// in error messages is the empty string. -// -// If syntax errors were found, the result is a partial AST (with ast.Bad* nodes -// representing the fragments of erroneous source code). Multiple errors are -// returned via a scanner.ErrorList which is sorted by source position. -func ParseExpr(x string) (ast.Expr, error) { - return ParseExprFrom(token.NewFileSet(), "", []byte(x), 0) -} diff --git a/internal/backport/go/parser/parser.go b/internal/backport/go/parser/parser.go deleted file mode 100644 index ea33adfc88..0000000000 --- a/internal/backport/go/parser/parser.go +++ /dev/null @@ -1,2936 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package parser implements a parser for Go source files. Input may be -// provided in a variety of forms (see the various Parse* functions); the -// output is an abstract syntax tree (AST) representing the Go source. The -// parser is invoked through one of the Parse* functions. -// -// The parser accepts a larger language than is syntactically permitted by -// the Go spec, for simplicity, and for improved robustness in the presence -// of syntax errors. For instance, in method declarations, the receiver is -// treated like an ordinary parameter list and thus may contain multiple -// entries where the spec permits exactly one. Consequently, the corresponding -// field in the AST (ast.FuncDecl.Recv) field is not restricted to one entry. -package parser - -import ( - "fmt" - "strconv" - "strings" - "unicode" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/internal/typeparams" - "golang.org/x/website/internal/backport/go/scanner" - "golang.org/x/website/internal/backport/go/token" -) - -// The parser structure holds the parser's internal state. -type parser struct { - file *token.File - errors scanner.ErrorList - scanner scanner.Scanner - - // Tracing/debugging - mode Mode // parsing mode - trace bool // == (mode&Trace != 0) - indent int // indentation used for tracing output - - // Comments - comments []*ast.CommentGroup - leadComment *ast.CommentGroup // last lead comment - lineComment *ast.CommentGroup // last line comment - - // Next token - pos token.Pos // token position - tok token.Token // one token look-ahead - lit string // token literal - - // Error recovery - // (used to limit the number of calls to parser.advance - // w/o making scanning progress - avoids potential endless - // loops across multiple parser functions during error recovery) - syncPos token.Pos // last synchronization position - syncCnt int // number of parser.advance calls without progress - - // Non-syntactic parser control - exprLev int // < 0: in control clause, >= 0: in expression - inRhs bool // if set, the parser is parsing a rhs expression - - imports []*ast.ImportSpec // list of imports - - // nestLev is used to track and limit the recursion depth - // during parsing. - nestLev int -} - -func (p *parser) init(fset *token.FileSet, filename string, src []byte, mode Mode) { - p.file = fset.AddFile(filename, -1, len(src)) - var m scanner.Mode - if mode&ParseComments != 0 { - m = scanner.ScanComments - } - eh := func(pos token.Position, msg string) { p.errors.Add(pos, msg) } - p.scanner.Init(p.file, src, eh, m) - - p.mode = mode - p.trace = mode&Trace != 0 // for convenience (p.trace is used frequently) - p.next() -} - -func (p *parser) allowGenerics() bool { return p.mode&typeparams.DisallowParsing == 0 } -func (p *parser) allowTypeSets() bool { return p.mode&typeparams.DisallowTypeSets == 0 } - -// ---------------------------------------------------------------------------- -// Parsing support - -func (p *parser) printTrace(a ...interface{}) { - const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " - const n = len(dots) - pos := p.file.Position(p.pos) - fmt.Printf("%5d:%3d: ", pos.Line, pos.Column) - i := 2 * p.indent - for i > n { - fmt.Print(dots) - i -= n - } - // i <= n - fmt.Print(dots[0:i]) - fmt.Println(a...) -} - -func trace(p *parser, msg string) *parser { - p.printTrace(msg, "(") - p.indent++ - return p -} - -// Usage pattern: defer un(trace(p, "...")) -func un(p *parser) { - p.indent-- - p.printTrace(")") -} - -// maxNestLev is the deepest we're willing to recurse during parsing -const maxNestLev int = 1e5 - -func incNestLev(p *parser) *parser { - p.nestLev++ - if p.nestLev > maxNestLev { - p.error(p.pos, "exceeded max nesting depth") - panic(bailout{}) - } - return p -} - -// decNestLev is used to track nesting depth during parsing to prevent stack exhaustion. -// It is used along with incNestLev in a similar fashion to how un and trace are used. -func decNestLev(p *parser) { - p.nestLev-- -} - -// Advance to the next token. -func (p *parser) next0() { - // Because of one-token look-ahead, print the previous token - // when tracing as it provides a more readable output. The - // very first token (!p.pos.IsValid()) is not initialized - // (it is token.ILLEGAL), so don't print it. - if p.trace && p.pos.IsValid() { - s := p.tok.String() - switch { - case p.tok.IsLiteral(): - p.printTrace(s, p.lit) - case p.tok.IsOperator(), p.tok.IsKeyword(): - p.printTrace("\"" + s + "\"") - default: - p.printTrace(s) - } - } - - p.pos, p.tok, p.lit = p.scanner.Scan() -} - -// Consume a comment and return it and the line on which it ends. -func (p *parser) consumeComment() (comment *ast.Comment, endline int) { - // /*-style comments may end on a different line than where they start. - // Scan the comment for '\n' chars and adjust endline accordingly. - endline = p.file.Line(p.pos) - if p.lit[1] == '*' { - // don't use range here - no need to decode Unicode code points - for i := 0; i < len(p.lit); i++ { - if p.lit[i] == '\n' { - endline++ - } - } - } - - comment = &ast.Comment{Slash: p.pos, Text: p.lit} - p.next0() - - return -} - -// Consume a group of adjacent comments, add it to the parser's -// comments list, and return it together with the line at which -// the last comment in the group ends. A non-comment token or n -// empty lines terminate a comment group. -func (p *parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) { - var list []*ast.Comment - endline = p.file.Line(p.pos) - for p.tok == token.COMMENT && p.file.Line(p.pos) <= endline+n { - var comment *ast.Comment - comment, endline = p.consumeComment() - list = append(list, comment) - } - - // add comment group to the comments list - comments = &ast.CommentGroup{List: list} - p.comments = append(p.comments, comments) - - return -} - -// Advance to the next non-comment token. In the process, collect -// any comment groups encountered, and remember the last lead and -// line comments. -// -// A lead comment is a comment group that starts and ends in a -// line without any other tokens and that is followed by a non-comment -// token on the line immediately after the comment group. -// -// A line comment is a comment group that follows a non-comment -// token on the same line, and that has no tokens after it on the line -// where it ends. -// -// Lead and line comments may be considered documentation that is -// stored in the AST. -func (p *parser) next() { - p.leadComment = nil - p.lineComment = nil - prev := p.pos - p.next0() - - if p.tok == token.COMMENT { - var comment *ast.CommentGroup - var endline int - - if p.file.Line(p.pos) == p.file.Line(prev) { - // The comment is on same line as the previous token; it - // cannot be a lead comment but may be a line comment. - comment, endline = p.consumeCommentGroup(0) - if p.file.Line(p.pos) != endline || p.tok == token.EOF { - // The next token is on a different line, thus - // the last comment group is a line comment. - p.lineComment = comment - } - } - - // consume successor comments, if any - endline = -1 - for p.tok == token.COMMENT { - comment, endline = p.consumeCommentGroup(1) - } - - if endline+1 == p.file.Line(p.pos) { - // The next token is following on the line immediately after the - // comment group, thus the last comment group is a lead comment. - p.leadComment = comment - } - } -} - -// A bailout panic is raised to indicate early termination. pos and msg are -// only populated when bailing out of object resolution. -type bailout struct { - pos token.Pos - msg string -} - -func (p *parser) error(pos token.Pos, msg string) { - if p.trace { - defer un(trace(p, "error: "+msg)) - } - - epos := p.file.Position(pos) - - // If AllErrors is not set, discard errors reported on the same line - // as the last recorded error and stop parsing if there are more than - // 10 errors. - if p.mode&AllErrors == 0 { - n := len(p.errors) - if n > 0 && p.errors[n-1].Pos.Line == epos.Line { - return // discard - likely a spurious error - } - if n > 10 { - panic(bailout{}) - } - } - - p.errors.Add(epos, msg) -} - -func (p *parser) errorExpected(pos token.Pos, msg string) { - msg = "expected " + msg - if pos == p.pos { - // the error happened at the current position; - // make the error message more specific - switch { - case p.tok == token.SEMICOLON && p.lit == "\n": - msg += ", found newline" - case p.tok.IsLiteral(): - // print 123 rather than 'INT', etc. - msg += ", found " + p.lit - default: - msg += ", found '" + p.tok.String() + "'" - } - } - p.error(pos, msg) -} - -func (p *parser) expect(tok token.Token) token.Pos { - pos := p.pos - if p.tok != tok { - p.errorExpected(pos, "'"+tok.String()+"'") - } - p.next() // make progress - return pos -} - -// expect2 is like expect, but it returns an invalid position -// if the expected token is not found. -func (p *parser) expect2(tok token.Token) (pos token.Pos) { - if p.tok == tok { - pos = p.pos - } else { - p.errorExpected(p.pos, "'"+tok.String()+"'") - } - p.next() // make progress - return -} - -// expectClosing is like expect but provides a better error message -// for the common case of a missing comma before a newline. -func (p *parser) expectClosing(tok token.Token, context string) token.Pos { - if p.tok != tok && p.tok == token.SEMICOLON && p.lit == "\n" { - p.error(p.pos, "missing ',' before newline in "+context) - p.next() - } - return p.expect(tok) -} - -func (p *parser) expectSemi() { - // semicolon is optional before a closing ')' or '}' - if p.tok != token.RPAREN && p.tok != token.RBRACE { - switch p.tok { - case token.COMMA: - // permit a ',' instead of a ';' but complain - p.errorExpected(p.pos, "';'") - fallthrough - case token.SEMICOLON: - p.next() - default: - p.errorExpected(p.pos, "';'") - p.advance(stmtStart) - } - } -} - -func (p *parser) atComma(context string, follow token.Token) bool { - if p.tok == token.COMMA { - return true - } - if p.tok != follow { - msg := "missing ','" - if p.tok == token.SEMICOLON && p.lit == "\n" { - msg += " before newline" - } - p.error(p.pos, msg+" in "+context) - return true // "insert" comma and continue - } - return false -} - -func assert(cond bool, msg string) { - if !cond { - panic("go/parser internal error: " + msg) - } -} - -// advance consumes tokens until the current token p.tok -// is in the 'to' set, or token.EOF. For error recovery. -func (p *parser) advance(to map[token.Token]bool) { - for ; p.tok != token.EOF; p.next() { - if to[p.tok] { - // Return only if parser made some progress since last - // sync or if it has not reached 10 advance calls without - // progress. Otherwise consume at least one token to - // avoid an endless parser loop (it is possible that - // both parseOperand and parseStmt call advance and - // correctly do not advance, thus the need for the - // invocation limit p.syncCnt). - if p.pos == p.syncPos && p.syncCnt < 10 { - p.syncCnt++ - return - } - if p.pos > p.syncPos { - p.syncPos = p.pos - p.syncCnt = 0 - return - } - // Reaching here indicates a parser bug, likely an - // incorrect token list in this function, but it only - // leads to skipping of possibly correct code if a - // previous error is present, and thus is preferred - // over a non-terminating parse. - } - } -} - -var stmtStart = map[token.Token]bool{ - token.BREAK: true, - token.CONST: true, - token.CONTINUE: true, - token.DEFER: true, - token.FALLTHROUGH: true, - token.FOR: true, - token.GO: true, - token.GOTO: true, - token.IF: true, - token.RETURN: true, - token.SELECT: true, - token.SWITCH: true, - token.TYPE: true, - token.VAR: true, -} - -var declStart = map[token.Token]bool{ - token.CONST: true, - token.TYPE: true, - token.VAR: true, -} - -var exprEnd = map[token.Token]bool{ - token.COMMA: true, - token.COLON: true, - token.SEMICOLON: true, - token.RPAREN: true, - token.RBRACK: true, - token.RBRACE: true, -} - -// safePos returns a valid file position for a given position: If pos -// is valid to begin with, safePos returns pos. If pos is out-of-range, -// safePos returns the EOF position. -// -// This is hack to work around "artificial" end positions in the AST which -// are computed by adding 1 to (presumably valid) token positions. If the -// token positions are invalid due to parse errors, the resulting end position -// may be past the file's EOF position, which would lead to panics if used -// later on. -func (p *parser) safePos(pos token.Pos) (res token.Pos) { - defer func() { - if recover() != nil { - res = token.Pos(p.file.Base() + p.file.Size()) // EOF position - } - }() - _ = p.file.Offset(pos) // trigger a panic if position is out-of-range - return pos -} - -// ---------------------------------------------------------------------------- -// Identifiers - -func (p *parser) parseIdent() *ast.Ident { - pos := p.pos - name := "_" - if p.tok == token.IDENT { - name = p.lit - p.next() - } else { - p.expect(token.IDENT) // use expect() error handling - } - return &ast.Ident{NamePos: pos, Name: name} -} - -func (p *parser) parseIdentList() (list []*ast.Ident) { - if p.trace { - defer un(trace(p, "IdentList")) - } - - list = append(list, p.parseIdent()) - for p.tok == token.COMMA { - p.next() - list = append(list, p.parseIdent()) - } - - return -} - -// ---------------------------------------------------------------------------- -// Common productions - -// If lhs is set, result list elements which are identifiers are not resolved. -func (p *parser) parseExprList() (list []ast.Expr) { - if p.trace { - defer un(trace(p, "ExpressionList")) - } - - list = append(list, p.checkExpr(p.parseExpr())) - for p.tok == token.COMMA { - p.next() - list = append(list, p.checkExpr(p.parseExpr())) - } - - return -} - -func (p *parser) parseList(inRhs bool) []ast.Expr { - old := p.inRhs - p.inRhs = inRhs - list := p.parseExprList() - p.inRhs = old - return list -} - -// ---------------------------------------------------------------------------- -// Types - -func (p *parser) parseType() ast.Expr { - if p.trace { - defer un(trace(p, "Type")) - } - - typ := p.tryIdentOrType() - - if typ == nil { - pos := p.pos - p.errorExpected(pos, "type") - p.advance(exprEnd) - return &ast.BadExpr{From: pos, To: p.pos} - } - - return typ -} - -func (p *parser) parseQualifiedIdent(ident *ast.Ident) ast.Expr { - if p.trace { - defer un(trace(p, "QualifiedIdent")) - } - - typ := p.parseTypeName(ident) - if p.tok == token.LBRACK && p.allowGenerics() { - typ = p.parseTypeInstance(typ) - } - - return typ -} - -// If the result is an identifier, it is not resolved. -func (p *parser) parseTypeName(ident *ast.Ident) ast.Expr { - if p.trace { - defer un(trace(p, "TypeName")) - } - - if ident == nil { - ident = p.parseIdent() - } - - if p.tok == token.PERIOD { - // ident is a package name - p.next() - sel := p.parseIdent() - return &ast.SelectorExpr{X: ident, Sel: sel} - } - - return ident -} - -// "[" has already been consumed, and lbrack is its position. -// If len != nil it is the already consumed array length. -func (p *parser) parseArrayType(lbrack token.Pos, len ast.Expr) *ast.ArrayType { - if p.trace { - defer un(trace(p, "ArrayType")) - } - - if len == nil { - p.exprLev++ - // always permit ellipsis for more fault-tolerant parsing - if p.tok == token.ELLIPSIS { - len = &ast.Ellipsis{Ellipsis: p.pos} - p.next() - } else if p.tok != token.RBRACK { - len = p.parseRhs() - } - p.exprLev-- - } - if p.tok == token.COMMA { - // Trailing commas are accepted in type parameter - // lists but not in array type declarations. - // Accept for better error handling but complain. - p.error(p.pos, "unexpected comma; expecting ]") - p.next() - } - p.expect(token.RBRACK) - elt := p.parseType() - return &ast.ArrayType{Lbrack: lbrack, Len: len, Elt: elt} -} - -func (p *parser) parseArrayFieldOrTypeInstance(x *ast.Ident) (*ast.Ident, ast.Expr) { - if p.trace { - defer un(trace(p, "ArrayFieldOrTypeInstance")) - } - - // TODO(gri) Should we allow a trailing comma in a type argument - // list such as T[P,]? (We do in parseTypeInstance). - lbrack := p.expect(token.LBRACK) - var args []ast.Expr - var firstComma token.Pos - // TODO(rfindley): consider changing parseRhsOrType so that this function variable - // is not needed. - argparser := p.parseRhsOrType - if !p.allowGenerics() { - argparser = p.parseRhs - } - if p.tok != token.RBRACK { - p.exprLev++ - args = append(args, argparser()) - for p.tok == token.COMMA { - if !firstComma.IsValid() { - firstComma = p.pos - } - p.next() - args = append(args, argparser()) - } - p.exprLev-- - } - rbrack := p.expect(token.RBRACK) - - if len(args) == 0 { - // x []E - elt := p.parseType() - return x, &ast.ArrayType{Lbrack: lbrack, Elt: elt} - } - - // x [P]E or x[P] - if len(args) == 1 { - elt := p.tryIdentOrType() - if elt != nil { - // x [P]E - return x, &ast.ArrayType{Lbrack: lbrack, Len: args[0], Elt: elt} - } - if !p.allowGenerics() { - p.error(rbrack, "missing element type in array type expression") - return nil, &ast.BadExpr{From: args[0].Pos(), To: args[0].End()} - } - } - - if !p.allowGenerics() { - p.error(firstComma, "expected ']', found ','") - return x, &ast.BadExpr{From: args[0].Pos(), To: args[len(args)-1].End()} - } - - // x[P], x[P1, P2], ... - return nil, typeparams.PackIndexExpr(x, lbrack, args, rbrack) -} - -func (p *parser) parseFieldDecl() *ast.Field { - if p.trace { - defer un(trace(p, "FieldDecl")) - } - - doc := p.leadComment - - var names []*ast.Ident - var typ ast.Expr - if p.tok == token.IDENT { - name := p.parseIdent() - if p.tok == token.PERIOD || p.tok == token.STRING || p.tok == token.SEMICOLON || p.tok == token.RBRACE { - // embedded type - typ = name - if p.tok == token.PERIOD { - typ = p.parseQualifiedIdent(name) - } - } else { - // name1, name2, ... T - names = []*ast.Ident{name} - for p.tok == token.COMMA { - p.next() - names = append(names, p.parseIdent()) - } - // Careful dance: We don't know if we have an embedded instantiated - // type T[P1, P2, ...] or a field T of array type []E or [P]E. - if len(names) == 1 && p.tok == token.LBRACK { - name, typ = p.parseArrayFieldOrTypeInstance(name) - if name == nil { - names = nil - } - } else { - // T P - typ = p.parseType() - } - } - } else { - // embedded, possibly generic type - // (using the enclosing parentheses to distinguish it from a named field declaration) - // TODO(rFindley) confirm that this doesn't allow parenthesized embedded type - typ = p.parseType() - } - - var tag *ast.BasicLit - if p.tok == token.STRING { - tag = &ast.BasicLit{ValuePos: p.pos, Kind: p.tok, Value: p.lit} - p.next() - } - - p.expectSemi() // call before accessing p.linecomment - - field := &ast.Field{Doc: doc, Names: names, Type: typ, Tag: tag, Comment: p.lineComment} - return field -} - -func (p *parser) parseStructType() *ast.StructType { - if p.trace { - defer un(trace(p, "StructType")) - } - - pos := p.expect(token.STRUCT) - lbrace := p.expect(token.LBRACE) - var list []*ast.Field - for p.tok == token.IDENT || p.tok == token.MUL || p.tok == token.LPAREN { - // a field declaration cannot start with a '(' but we accept - // it here for more robust parsing and better error messages - // (parseFieldDecl will check and complain if necessary) - list = append(list, p.parseFieldDecl()) - } - rbrace := p.expect(token.RBRACE) - - return &ast.StructType{ - Struct: pos, - Fields: &ast.FieldList{ - Opening: lbrace, - List: list, - Closing: rbrace, - }, - } -} - -func (p *parser) parsePointerType() *ast.StarExpr { - if p.trace { - defer un(trace(p, "PointerType")) - } - - star := p.expect(token.MUL) - base := p.parseType() - - return &ast.StarExpr{Star: star, X: base} -} - -func (p *parser) parseDotsType() *ast.Ellipsis { - if p.trace { - defer un(trace(p, "DotsType")) - } - - pos := p.expect(token.ELLIPSIS) - elt := p.parseType() - - return &ast.Ellipsis{Ellipsis: pos, Elt: elt} -} - -type field struct { - name *ast.Ident - typ ast.Expr -} - -func (p *parser) parseParamDecl(name *ast.Ident, typeSetsOK bool) (f field) { - // TODO(rFindley) refactor to be more similar to paramDeclOrNil in the syntax - // package - if p.trace { - defer un(trace(p, "ParamDeclOrNil")) - } - - ptok := p.tok - if name != nil { - p.tok = token.IDENT // force token.IDENT case in switch below - } else if typeSetsOK && p.tok == token.TILDE { - // "~" ... - return field{nil, p.embeddedElem(nil)} - } - - switch p.tok { - case token.IDENT: - // name - if name != nil { - f.name = name - p.tok = ptok - } else { - f.name = p.parseIdent() - } - switch p.tok { - case token.IDENT, token.MUL, token.ARROW, token.FUNC, token.CHAN, token.MAP, token.STRUCT, token.INTERFACE, token.LPAREN: - // name type - f.typ = p.parseType() - - case token.LBRACK: - // name "[" type1, ..., typeN "]" or name "[" n "]" type - f.name, f.typ = p.parseArrayFieldOrTypeInstance(f.name) - - case token.ELLIPSIS: - // name "..." type - f.typ = p.parseDotsType() - return // don't allow ...type "|" ... - - case token.PERIOD: - // name "." ... - f.typ = p.parseQualifiedIdent(f.name) - f.name = nil - - case token.TILDE: - if typeSetsOK { - f.typ = p.embeddedElem(nil) - return - } - - case token.OR: - if typeSetsOK { - // name "|" typeset - f.typ = p.embeddedElem(f.name) - f.name = nil - return - } - } - - case token.MUL, token.ARROW, token.FUNC, token.LBRACK, token.CHAN, token.MAP, token.STRUCT, token.INTERFACE, token.LPAREN: - // type - f.typ = p.parseType() - - case token.ELLIPSIS: - // "..." type - // (always accepted) - f.typ = p.parseDotsType() - return // don't allow ...type "|" ... - - default: - // TODO(rfindley): this is incorrect in the case of type parameter lists - // (should be "']'" in that case) - p.errorExpected(p.pos, "')'") - p.advance(exprEnd) - } - - // [name] type "|" - if typeSetsOK && p.tok == token.OR && f.typ != nil { - f.typ = p.embeddedElem(f.typ) - } - - return -} - -func (p *parser) parseParameterList(name0 *ast.Ident, typ0 ast.Expr, closing token.Token) (params []*ast.Field) { - if p.trace { - defer un(trace(p, "ParameterList")) - } - - // Type parameters are the only parameter list closed by ']'. - tparams := closing == token.RBRACK - // Type set notation is ok in type parameter lists. - typeSetsOK := tparams && p.allowTypeSets() - - pos := p.pos - if name0 != nil { - pos = name0.Pos() - } - - var list []field - var named int // number of parameters that have an explicit name and type - - for name0 != nil || p.tok != closing && p.tok != token.EOF { - var par field - if typ0 != nil { - if typeSetsOK { - typ0 = p.embeddedElem(typ0) - } - par = field{name0, typ0} - } else { - par = p.parseParamDecl(name0, typeSetsOK) - } - name0 = nil // 1st name was consumed if present - typ0 = nil // 1st typ was consumed if present - if par.name != nil || par.typ != nil { - list = append(list, par) - if par.name != nil && par.typ != nil { - named++ - } - } - if !p.atComma("parameter list", closing) { - break - } - p.next() - } - - if len(list) == 0 { - return // not uncommon - } - - // TODO(gri) parameter distribution and conversion to []*ast.Field - // can be combined and made more efficient - - // distribute parameter types - if named == 0 { - // all unnamed => found names are type names - for i := 0; i < len(list); i++ { - par := &list[i] - if typ := par.name; typ != nil { - par.typ = typ - par.name = nil - } - } - if tparams { - p.error(pos, "all type parameters must be named") - } - } else if named != len(list) { - // some named => all must be named - ok := true - var typ ast.Expr - missingName := pos - for i := len(list) - 1; i >= 0; i-- { - if par := &list[i]; par.typ != nil { - typ = par.typ - if par.name == nil { - ok = false - missingName = par.typ.Pos() - n := ast.NewIdent("_") - n.NamePos = typ.Pos() // correct position - par.name = n - } - } else if typ != nil { - par.typ = typ - } else { - // par.typ == nil && typ == nil => we only have a par.name - ok = false - missingName = par.name.Pos() - par.typ = &ast.BadExpr{From: par.name.Pos(), To: p.pos} - } - } - if !ok { - if tparams { - p.error(missingName, "all type parameters must be named") - } else { - p.error(pos, "mixed named and unnamed parameters") - } - } - } - - // convert list []*ast.Field - if named == 0 { - // parameter list consists of types only - for _, par := range list { - assert(par.typ != nil, "nil type in unnamed parameter list") - params = append(params, &ast.Field{Type: par.typ}) - } - return - } - - // parameter list consists of named parameters with types - var names []*ast.Ident - var typ ast.Expr - addParams := func() { - assert(typ != nil, "nil type in named parameter list") - field := &ast.Field{Names: names, Type: typ} - params = append(params, field) - names = nil - } - for _, par := range list { - if par.typ != typ { - if len(names) > 0 { - addParams() - } - typ = par.typ - } - names = append(names, par.name) - } - if len(names) > 0 { - addParams() - } - return -} - -func (p *parser) parseParameters(acceptTParams bool) (tparams, params *ast.FieldList) { - if p.trace { - defer un(trace(p, "Parameters")) - } - - if p.allowGenerics() && acceptTParams && p.tok == token.LBRACK { - opening := p.pos - p.next() - // [T any](params) syntax - list := p.parseParameterList(nil, nil, token.RBRACK) - rbrack := p.expect(token.RBRACK) - tparams = &ast.FieldList{Opening: opening, List: list, Closing: rbrack} - // Type parameter lists must not be empty. - if tparams.NumFields() == 0 { - p.error(tparams.Closing, "empty type parameter list") - tparams = nil // avoid follow-on errors - } - } - - opening := p.expect(token.LPAREN) - - var fields []*ast.Field - if p.tok != token.RPAREN { - fields = p.parseParameterList(nil, nil, token.RPAREN) - } - - rparen := p.expect(token.RPAREN) - params = &ast.FieldList{Opening: opening, List: fields, Closing: rparen} - - return -} - -func (p *parser) parseResult() *ast.FieldList { - if p.trace { - defer un(trace(p, "Result")) - } - - if p.tok == token.LPAREN { - _, results := p.parseParameters(false) - return results - } - - typ := p.tryIdentOrType() - if typ != nil { - list := make([]*ast.Field, 1) - list[0] = &ast.Field{Type: typ} - return &ast.FieldList{List: list} - } - - return nil -} - -func (p *parser) parseFuncType() *ast.FuncType { - if p.trace { - defer un(trace(p, "FuncType")) - } - - pos := p.expect(token.FUNC) - tparams, params := p.parseParameters(true) - if tparams != nil { - p.error(tparams.Pos(), "function type must have no type parameters") - } - results := p.parseResult() - - return &ast.FuncType{Func: pos, Params: params, Results: results} -} - -func (p *parser) parseMethodSpec() *ast.Field { - if p.trace { - defer un(trace(p, "MethodSpec")) - } - - doc := p.leadComment - var idents []*ast.Ident - var typ ast.Expr - x := p.parseTypeName(nil) - if ident, _ := x.(*ast.Ident); ident != nil { - switch { - case p.tok == token.LBRACK && p.allowGenerics(): - // generic method or embedded instantiated type - lbrack := p.pos - p.next() - p.exprLev++ - x := p.parseExpr() - p.exprLev-- - if name0, _ := x.(*ast.Ident); name0 != nil && p.tok != token.COMMA && p.tok != token.RBRACK { - // generic method m[T any] - // - // Interface methods do not have type parameters. We parse them for a - // better error message and improved error recovery. - _ = p.parseParameterList(name0, nil, token.RBRACK) - _ = p.expect(token.RBRACK) - p.error(lbrack, "interface method must have no type parameters") - - // TODO(rfindley) refactor to share code with parseFuncType. - _, params := p.parseParameters(false) - results := p.parseResult() - idents = []*ast.Ident{ident} - typ = &ast.FuncType{ - Func: token.NoPos, - Params: params, - Results: results, - } - } else { - // embedded instantiated type - // TODO(rfindley) should resolve all identifiers in x. - list := []ast.Expr{x} - if p.atComma("type argument list", token.RBRACK) { - p.exprLev++ - p.next() - for p.tok != token.RBRACK && p.tok != token.EOF { - list = append(list, p.parseType()) - if !p.atComma("type argument list", token.RBRACK) { - break - } - p.next() - } - p.exprLev-- - } - rbrack := p.expectClosing(token.RBRACK, "type argument list") - typ = typeparams.PackIndexExpr(ident, lbrack, list, rbrack) - } - case p.tok == token.LPAREN: - // ordinary method - // TODO(rfindley) refactor to share code with parseFuncType. - _, params := p.parseParameters(false) - results := p.parseResult() - idents = []*ast.Ident{ident} - typ = &ast.FuncType{Func: token.NoPos, Params: params, Results: results} - default: - // embedded type - typ = x - } - } else { - // embedded, possibly instantiated type - typ = x - if p.tok == token.LBRACK && p.allowGenerics() { - // embedded instantiated interface - typ = p.parseTypeInstance(typ) - } - } - - // Comment is added at the callsite: the field below may joined with - // additional type specs using '|'. - // TODO(rfindley) this should be refactored. - // TODO(rfindley) add more tests for comment handling. - return &ast.Field{Doc: doc, Names: idents, Type: typ} -} - -func (p *parser) embeddedElem(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "EmbeddedElem")) - } - if x == nil { - x = p.embeddedTerm() - } - for p.tok == token.OR { - t := new(ast.BinaryExpr) - t.OpPos = p.pos - t.Op = token.OR - p.next() - t.X = x - t.Y = p.embeddedTerm() - x = t - } - return x -} - -func (p *parser) embeddedTerm() ast.Expr { - if p.trace { - defer un(trace(p, "EmbeddedTerm")) - } - if p.tok == token.TILDE { - t := new(ast.UnaryExpr) - t.OpPos = p.pos - t.Op = token.TILDE - p.next() - t.X = p.parseType() - return t - } - - t := p.tryIdentOrType() - if t == nil { - pos := p.pos - p.errorExpected(pos, "~ term or type") - p.advance(exprEnd) - return &ast.BadExpr{From: pos, To: p.pos} - } - - return t -} - -func (p *parser) parseInterfaceType() *ast.InterfaceType { - if p.trace { - defer un(trace(p, "InterfaceType")) - } - - pos := p.expect(token.INTERFACE) - lbrace := p.expect(token.LBRACE) - - var list []*ast.Field - -parseElements: - for { - switch { - case p.tok == token.IDENT: - f := p.parseMethodSpec() - if f.Names == nil && p.allowGenerics() { - f.Type = p.embeddedElem(f.Type) - } - p.expectSemi() - f.Comment = p.lineComment - list = append(list, f) - case p.tok == token.TILDE && p.allowGenerics(): - typ := p.embeddedElem(nil) - p.expectSemi() - comment := p.lineComment - list = append(list, &ast.Field{Type: typ, Comment: comment}) - case p.allowGenerics(): - if t := p.tryIdentOrType(); t != nil { - typ := p.embeddedElem(t) - p.expectSemi() - comment := p.lineComment - list = append(list, &ast.Field{Type: typ, Comment: comment}) - } else { - break parseElements - } - default: - break parseElements - } - } - - // TODO(rfindley): the error produced here could be improved, since we could - // accept a identifier, 'type', or a '}' at this point. - rbrace := p.expect(token.RBRACE) - - return &ast.InterfaceType{ - Interface: pos, - Methods: &ast.FieldList{ - Opening: lbrace, - List: list, - Closing: rbrace, - }, - } -} - -func (p *parser) parseMapType() *ast.MapType { - if p.trace { - defer un(trace(p, "MapType")) - } - - pos := p.expect(token.MAP) - p.expect(token.LBRACK) - key := p.parseType() - p.expect(token.RBRACK) - value := p.parseType() - - return &ast.MapType{Map: pos, Key: key, Value: value} -} - -func (p *parser) parseChanType() *ast.ChanType { - if p.trace { - defer un(trace(p, "ChanType")) - } - - pos := p.pos - dir := ast.SEND | ast.RECV - var arrow token.Pos - if p.tok == token.CHAN { - p.next() - if p.tok == token.ARROW { - arrow = p.pos - p.next() - dir = ast.SEND - } - } else { - arrow = p.expect(token.ARROW) - p.expect(token.CHAN) - dir = ast.RECV - } - value := p.parseType() - - return &ast.ChanType{Begin: pos, Arrow: arrow, Dir: dir, Value: value} -} - -func (p *parser) parseTypeInstance(typ ast.Expr) ast.Expr { - assert(p.allowGenerics(), "parseTypeInstance while not parsing type params") - if p.trace { - defer un(trace(p, "TypeInstance")) - } - - opening := p.expect(token.LBRACK) - p.exprLev++ - var list []ast.Expr - for p.tok != token.RBRACK && p.tok != token.EOF { - list = append(list, p.parseType()) - if !p.atComma("type argument list", token.RBRACK) { - break - } - p.next() - } - p.exprLev-- - - closing := p.expectClosing(token.RBRACK, "type argument list") - - if len(list) == 0 { - p.errorExpected(closing, "type argument list") - return &ast.IndexExpr{ - X: typ, - Lbrack: opening, - Index: &ast.BadExpr{From: opening + 1, To: closing}, - Rbrack: closing, - } - } - - return typeparams.PackIndexExpr(typ, opening, list, closing) -} - -func (p *parser) tryIdentOrType() ast.Expr { - defer decNestLev(incNestLev(p)) - - switch p.tok { - case token.IDENT: - typ := p.parseTypeName(nil) - if p.tok == token.LBRACK && p.allowGenerics() { - typ = p.parseTypeInstance(typ) - } - return typ - case token.LBRACK: - lbrack := p.expect(token.LBRACK) - return p.parseArrayType(lbrack, nil) - case token.STRUCT: - return p.parseStructType() - case token.MUL: - return p.parsePointerType() - case token.FUNC: - typ := p.parseFuncType() - return typ - case token.INTERFACE: - return p.parseInterfaceType() - case token.MAP: - return p.parseMapType() - case token.CHAN, token.ARROW: - return p.parseChanType() - case token.LPAREN: - lparen := p.pos - p.next() - typ := p.parseType() - rparen := p.expect(token.RPAREN) - return &ast.ParenExpr{Lparen: lparen, X: typ, Rparen: rparen} - } - - // no type found - return nil -} - -// ---------------------------------------------------------------------------- -// Blocks - -func (p *parser) parseStmtList() (list []ast.Stmt) { - if p.trace { - defer un(trace(p, "StatementList")) - } - - for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF { - list = append(list, p.parseStmt()) - } - - return -} - -func (p *parser) parseBody() *ast.BlockStmt { - if p.trace { - defer un(trace(p, "Body")) - } - - lbrace := p.expect(token.LBRACE) - list := p.parseStmtList() - rbrace := p.expect2(token.RBRACE) - - return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace} -} - -func (p *parser) parseBlockStmt() *ast.BlockStmt { - if p.trace { - defer un(trace(p, "BlockStmt")) - } - - lbrace := p.expect(token.LBRACE) - list := p.parseStmtList() - rbrace := p.expect2(token.RBRACE) - - return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace} -} - -// ---------------------------------------------------------------------------- -// Expressions - -func (p *parser) parseFuncTypeOrLit() ast.Expr { - if p.trace { - defer un(trace(p, "FuncTypeOrLit")) - } - - typ := p.parseFuncType() - if p.tok != token.LBRACE { - // function type only - return typ - } - - p.exprLev++ - body := p.parseBody() - p.exprLev-- - - return &ast.FuncLit{Type: typ, Body: body} -} - -// parseOperand may return an expression or a raw type (incl. array -// types of the form [...]T. Callers must verify the result. -func (p *parser) parseOperand() ast.Expr { - if p.trace { - defer un(trace(p, "Operand")) - } - - switch p.tok { - case token.IDENT: - x := p.parseIdent() - return x - - case token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING: - x := &ast.BasicLit{ValuePos: p.pos, Kind: p.tok, Value: p.lit} - p.next() - return x - - case token.LPAREN: - lparen := p.pos - p.next() - p.exprLev++ - x := p.parseRhsOrType() // types may be parenthesized: (some type) - p.exprLev-- - rparen := p.expect(token.RPAREN) - return &ast.ParenExpr{Lparen: lparen, X: x, Rparen: rparen} - - case token.FUNC: - return p.parseFuncTypeOrLit() - } - - if typ := p.tryIdentOrType(); typ != nil { // do not consume trailing type parameters - // could be type for composite literal or conversion - _, isIdent := typ.(*ast.Ident) - assert(!isIdent, "type cannot be identifier") - return typ - } - - // we have an error - pos := p.pos - p.errorExpected(pos, "operand") - p.advance(stmtStart) - return &ast.BadExpr{From: pos, To: p.pos} -} - -func (p *parser) parseSelector(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "Selector")) - } - - sel := p.parseIdent() - - return &ast.SelectorExpr{X: x, Sel: sel} -} - -func (p *parser) parseTypeAssertion(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "TypeAssertion")) - } - - lparen := p.expect(token.LPAREN) - var typ ast.Expr - if p.tok == token.TYPE { - // type switch: typ == nil - p.next() - } else { - typ = p.parseType() - } - rparen := p.expect(token.RPAREN) - - return &ast.TypeAssertExpr{X: x, Type: typ, Lparen: lparen, Rparen: rparen} -} - -func (p *parser) parseIndexOrSliceOrInstance(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "parseIndexOrSliceOrInstance")) - } - - lbrack := p.expect(token.LBRACK) - if p.tok == token.RBRACK { - // empty index, slice or index expressions are not permitted; - // accept them for parsing tolerance, but complain - p.errorExpected(p.pos, "operand") - rbrack := p.pos - p.next() - return &ast.IndexExpr{ - X: x, - Lbrack: lbrack, - Index: &ast.BadExpr{From: rbrack, To: rbrack}, - Rbrack: rbrack, - } - } - p.exprLev++ - - const N = 3 // change the 3 to 2 to disable 3-index slices - var args []ast.Expr - var index [N]ast.Expr - var colons [N - 1]token.Pos - var firstComma token.Pos - if p.tok != token.COLON { - // We can't know if we have an index expression or a type instantiation; - // so even if we see a (named) type we are not going to be in type context. - index[0] = p.parseRhsOrType() - } - ncolons := 0 - switch p.tok { - case token.COLON: - // slice expression - for p.tok == token.COLON && ncolons < len(colons) { - colons[ncolons] = p.pos - ncolons++ - p.next() - if p.tok != token.COLON && p.tok != token.RBRACK && p.tok != token.EOF { - index[ncolons] = p.parseRhs() - } - } - case token.COMMA: - firstComma = p.pos - // instance expression - args = append(args, index[0]) - for p.tok == token.COMMA { - p.next() - if p.tok != token.RBRACK && p.tok != token.EOF { - args = append(args, p.parseType()) - } - } - } - - p.exprLev-- - rbrack := p.expect(token.RBRACK) - - if ncolons > 0 { - // slice expression - slice3 := false - if ncolons == 2 { - slice3 = true - // Check presence of 2nd and 3rd index here rather than during type-checking - // to prevent erroneous programs from passing through gofmt (was issue 7305). - if index[1] == nil { - p.error(colons[0], "2nd index required in 3-index slice") - index[1] = &ast.BadExpr{From: colons[0] + 1, To: colons[1]} - } - if index[2] == nil { - p.error(colons[1], "3rd index required in 3-index slice") - index[2] = &ast.BadExpr{From: colons[1] + 1, To: rbrack} - } - } - return &ast.SliceExpr{X: x, Lbrack: lbrack, Low: index[0], High: index[1], Max: index[2], Slice3: slice3, Rbrack: rbrack} - } - - if len(args) == 0 { - // index expression - return &ast.IndexExpr{X: x, Lbrack: lbrack, Index: index[0], Rbrack: rbrack} - } - - if !p.allowGenerics() { - p.error(firstComma, "expected ']' or ':', found ','") - return &ast.BadExpr{From: args[0].Pos(), To: args[len(args)-1].End()} - } - - // instance expression - return typeparams.PackIndexExpr(x, lbrack, args, rbrack) -} - -func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr { - if p.trace { - defer un(trace(p, "CallOrConversion")) - } - - lparen := p.expect(token.LPAREN) - p.exprLev++ - var list []ast.Expr - var ellipsis token.Pos - for p.tok != token.RPAREN && p.tok != token.EOF && !ellipsis.IsValid() { - list = append(list, p.parseRhsOrType()) // builtins may expect a type: make(some type, ...) - if p.tok == token.ELLIPSIS { - ellipsis = p.pos - p.next() - } - if !p.atComma("argument list", token.RPAREN) { - break - } - p.next() - } - p.exprLev-- - rparen := p.expectClosing(token.RPAREN, "argument list") - - return &ast.CallExpr{Fun: fun, Lparen: lparen, Args: list, Ellipsis: ellipsis, Rparen: rparen} -} - -func (p *parser) parseValue() ast.Expr { - if p.trace { - defer un(trace(p, "Element")) - } - - if p.tok == token.LBRACE { - return p.parseLiteralValue(nil) - } - - x := p.checkExpr(p.parseExpr()) - - return x -} - -func (p *parser) parseElement() ast.Expr { - if p.trace { - defer un(trace(p, "Element")) - } - - x := p.parseValue() - if p.tok == token.COLON { - colon := p.pos - p.next() - x = &ast.KeyValueExpr{Key: x, Colon: colon, Value: p.parseValue()} - } - - return x -} - -func (p *parser) parseElementList() (list []ast.Expr) { - if p.trace { - defer un(trace(p, "ElementList")) - } - - for p.tok != token.RBRACE && p.tok != token.EOF { - list = append(list, p.parseElement()) - if !p.atComma("composite literal", token.RBRACE) { - break - } - p.next() - } - - return -} - -func (p *parser) parseLiteralValue(typ ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "LiteralValue")) - } - - lbrace := p.expect(token.LBRACE) - var elts []ast.Expr - p.exprLev++ - if p.tok != token.RBRACE { - elts = p.parseElementList() - } - p.exprLev-- - rbrace := p.expectClosing(token.RBRACE, "composite literal") - return &ast.CompositeLit{Type: typ, Lbrace: lbrace, Elts: elts, Rbrace: rbrace} -} - -// checkExpr checks that x is an expression (and not a type). -func (p *parser) checkExpr(x ast.Expr) ast.Expr { - switch unparen(x).(type) { - case *ast.BadExpr: - case *ast.Ident: - case *ast.BasicLit: - case *ast.FuncLit: - case *ast.CompositeLit: - case *ast.ParenExpr: - panic("unreachable") - case *ast.SelectorExpr: - case *ast.IndexExpr: - case *ast.IndexListExpr: - case *ast.SliceExpr: - case *ast.TypeAssertExpr: - // If t.Type == nil we have a type assertion of the form - // y.(type), which is only allowed in type switch expressions. - // It's hard to exclude those but for the case where we are in - // a type switch. Instead be lenient and test this in the type - // checker. - case *ast.CallExpr: - case *ast.StarExpr: - case *ast.UnaryExpr: - case *ast.BinaryExpr: - default: - // all other nodes are not proper expressions - p.errorExpected(x.Pos(), "expression") - x = &ast.BadExpr{From: x.Pos(), To: p.safePos(x.End())} - } - return x -} - -// If x is of the form (T), unparen returns unparen(T), otherwise it returns x. -func unparen(x ast.Expr) ast.Expr { - if p, isParen := x.(*ast.ParenExpr); isParen { - x = unparen(p.X) - } - return x -} - -// checkExprOrType checks that x is an expression or a type -// (and not a raw type such as [...]T). -func (p *parser) checkExprOrType(x ast.Expr) ast.Expr { - switch t := unparen(x).(type) { - case *ast.ParenExpr: - panic("unreachable") - case *ast.ArrayType: - if len, isEllipsis := t.Len.(*ast.Ellipsis); isEllipsis { - p.error(len.Pos(), "expected array length, found '...'") - x = &ast.BadExpr{From: x.Pos(), To: p.safePos(x.End())} - } - } - - // all other nodes are expressions or types - return x -} - -func (p *parser) parsePrimaryExpr(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "PrimaryExpr")) - } - - if x == nil { - x = p.parseOperand() - } - // We track the nesting here rather than at the entry for the function, - // since it can iteratively produce a nested output, and we want to - // limit how deep a structure we generate. - var n int - defer func() { p.nestLev -= n }() - for n = 1; ; n++ { - incNestLev(p) - switch p.tok { - case token.PERIOD: - p.next() - switch p.tok { - case token.IDENT: - x = p.parseSelector(p.checkExprOrType(x)) - case token.LPAREN: - x = p.parseTypeAssertion(p.checkExpr(x)) - default: - pos := p.pos - p.errorExpected(pos, "selector or type assertion") - // TODO(rFindley) The check for token.RBRACE below is a targeted fix - // to error recovery sufficient to make the x/tools tests to - // pass with the new parsing logic introduced for type - // parameters. Remove this once error recovery has been - // more generally reconsidered. - if p.tok != token.RBRACE { - p.next() // make progress - } - sel := &ast.Ident{NamePos: pos, Name: "_"} - x = &ast.SelectorExpr{X: x, Sel: sel} - } - case token.LBRACK: - x = p.parseIndexOrSliceOrInstance(p.checkExpr(x)) - case token.LPAREN: - x = p.parseCallOrConversion(p.checkExprOrType(x)) - case token.LBRACE: - // operand may have returned a parenthesized complit - // type; accept it but complain if we have a complit - t := unparen(x) - // determine if '{' belongs to a composite literal or a block statement - switch t.(type) { - case *ast.BadExpr, *ast.Ident, *ast.SelectorExpr: - if p.exprLev < 0 { - return x - } - // x is possibly a composite literal type - case *ast.IndexExpr, *ast.IndexListExpr: - if p.exprLev < 0 { - return x - } - // x is possibly a composite literal type - case *ast.ArrayType, *ast.StructType, *ast.MapType: - // x is a composite literal type - default: - return x - } - if t != x { - p.error(t.Pos(), "cannot parenthesize type in composite literal") - // already progressed, no need to advance - } - x = p.parseLiteralValue(x) - default: - return x - } - } -} - -func (p *parser) parseUnaryExpr() ast.Expr { - defer decNestLev(incNestLev(p)) - - if p.trace { - defer un(trace(p, "UnaryExpr")) - } - - switch p.tok { - case token.ADD, token.SUB, token.NOT, token.XOR, token.AND, token.TILDE: - pos, op := p.pos, p.tok - p.next() - x := p.parseUnaryExpr() - return &ast.UnaryExpr{OpPos: pos, Op: op, X: p.checkExpr(x)} - - case token.ARROW: - // channel type or receive expression - arrow := p.pos - p.next() - - // If the next token is token.CHAN we still don't know if it - // is a channel type or a receive operation - we only know - // once we have found the end of the unary expression. There - // are two cases: - // - // <- type => (<-type) must be channel type - // <- expr => <-(expr) is a receive from an expression - // - // In the first case, the arrow must be re-associated with - // the channel type parsed already: - // - // <- (chan type) => (<-chan type) - // <- (chan<- type) => (<-chan (<-type)) - - x := p.parseUnaryExpr() - - // determine which case we have - if typ, ok := x.(*ast.ChanType); ok { - // (<-type) - - // re-associate position info and <- - dir := ast.SEND - for ok && dir == ast.SEND { - if typ.Dir == ast.RECV { - // error: (<-type) is (<-(<-chan T)) - p.errorExpected(typ.Arrow, "'chan'") - } - arrow, typ.Begin, typ.Arrow = typ.Arrow, arrow, arrow - dir, typ.Dir = typ.Dir, ast.RECV - typ, ok = typ.Value.(*ast.ChanType) - } - if dir == ast.SEND { - p.errorExpected(arrow, "channel type") - } - - return x - } - - // <-(expr) - return &ast.UnaryExpr{OpPos: arrow, Op: token.ARROW, X: p.checkExpr(x)} - - case token.MUL: - // pointer type or unary "*" expression - pos := p.pos - p.next() - x := p.parseUnaryExpr() - return &ast.StarExpr{Star: pos, X: p.checkExprOrType(x)} - } - - return p.parsePrimaryExpr(nil) -} - -func (p *parser) tokPrec() (token.Token, int) { - tok := p.tok - if p.inRhs && tok == token.ASSIGN { - tok = token.EQL - } - return tok, tok.Precedence() -} - -// parseBinaryExpr parses a (possibly) binary expression. -// If x is non-nil, it is used as the left operand. -// If check is true, operands are checked to be valid expressions. -// -// TODO(rfindley): parseBinaryExpr has become overloaded. Consider refactoring. -func (p *parser) parseBinaryExpr(x ast.Expr, prec1 int, check bool) ast.Expr { - if p.trace { - defer un(trace(p, "BinaryExpr")) - } - - if x == nil { - x = p.parseUnaryExpr() - } - // We track the nesting here rather than at the entry for the function, - // since it can iteratively produce a nested output, and we want to - // limit how deep a structure we generate. - var n int - defer func() { p.nestLev -= n }() - for n = 1; ; n++ { - incNestLev(p) - op, oprec := p.tokPrec() - if oprec < prec1 { - return x - } - pos := p.expect(op) - y := p.parseBinaryExpr(nil, oprec+1, check) - if check { - x = p.checkExpr(x) - y = p.checkExpr(y) - } - x = &ast.BinaryExpr{X: x, OpPos: pos, Op: op, Y: y} - } -} - -// The result may be a type or even a raw type ([...]int). Callers must -// check the result (using checkExpr or checkExprOrType), depending on -// context. -func (p *parser) parseExpr() ast.Expr { - if p.trace { - defer un(trace(p, "Expression")) - } - - return p.parseBinaryExpr(nil, token.LowestPrec+1, true) -} - -func (p *parser) parseRhs() ast.Expr { - old := p.inRhs - p.inRhs = true - x := p.checkExpr(p.parseExpr()) - p.inRhs = old - return x -} - -func (p *parser) parseRhsOrType() ast.Expr { - old := p.inRhs - p.inRhs = true - x := p.checkExprOrType(p.parseExpr()) - p.inRhs = old - return x -} - -// ---------------------------------------------------------------------------- -// Statements - -// Parsing modes for parseSimpleStmt. -const ( - basic = iota - labelOk - rangeOk -) - -// parseSimpleStmt returns true as 2nd result if it parsed the assignment -// of a range clause (with mode == rangeOk). The returned statement is an -// assignment with a right-hand side that is a single unary expression of -// the form "range x". No guarantees are given for the left-hand side. -func (p *parser) parseSimpleStmt(mode int) (ast.Stmt, bool) { - if p.trace { - defer un(trace(p, "SimpleStmt")) - } - - x := p.parseList(false) - - switch p.tok { - case - token.DEFINE, token.ASSIGN, token.ADD_ASSIGN, - token.SUB_ASSIGN, token.MUL_ASSIGN, token.QUO_ASSIGN, - token.REM_ASSIGN, token.AND_ASSIGN, token.OR_ASSIGN, - token.XOR_ASSIGN, token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN: - // assignment statement, possibly part of a range clause - pos, tok := p.pos, p.tok - p.next() - var y []ast.Expr - isRange := false - if mode == rangeOk && p.tok == token.RANGE && (tok == token.DEFINE || tok == token.ASSIGN) { - pos := p.pos - p.next() - y = []ast.Expr{&ast.UnaryExpr{OpPos: pos, Op: token.RANGE, X: p.parseRhs()}} - isRange = true - } else { - y = p.parseList(true) - } - as := &ast.AssignStmt{Lhs: x, TokPos: pos, Tok: tok, Rhs: y} - if tok == token.DEFINE { - p.checkAssignStmt(as) - } - return as, isRange - } - - if len(x) > 1 { - p.errorExpected(x[0].Pos(), "1 expression") - // continue with first expression - } - - switch p.tok { - case token.COLON: - // labeled statement - colon := p.pos - p.next() - if label, isIdent := x[0].(*ast.Ident); mode == labelOk && isIdent { - // Go spec: The scope of a label is the body of the function - // in which it is declared and excludes the body of any nested - // function. - stmt := &ast.LabeledStmt{Label: label, Colon: colon, Stmt: p.parseStmt()} - return stmt, false - } - // The label declaration typically starts at x[0].Pos(), but the label - // declaration may be erroneous due to a token after that position (and - // before the ':'). If SpuriousErrors is not set, the (only) error - // reported for the line is the illegal label error instead of the token - // before the ':' that caused the problem. Thus, use the (latest) colon - // position for error reporting. - p.error(colon, "illegal label declaration") - return &ast.BadStmt{From: x[0].Pos(), To: colon + 1}, false - - case token.ARROW: - // send statement - arrow := p.pos - p.next() - y := p.parseRhs() - return &ast.SendStmt{Chan: x[0], Arrow: arrow, Value: y}, false - - case token.INC, token.DEC: - // increment or decrement - s := &ast.IncDecStmt{X: x[0], TokPos: p.pos, Tok: p.tok} - p.next() - return s, false - } - - // expression - return &ast.ExprStmt{X: x[0]}, false -} - -func (p *parser) checkAssignStmt(as *ast.AssignStmt) { - for _, x := range as.Lhs { - if _, isIdent := x.(*ast.Ident); !isIdent { - p.errorExpected(x.Pos(), "identifier on left side of :=") - } - } -} - -func (p *parser) parseCallExpr(callType string) *ast.CallExpr { - x := p.parseRhsOrType() // could be a conversion: (some type)(x) - if call, isCall := x.(*ast.CallExpr); isCall { - return call - } - if _, isBad := x.(*ast.BadExpr); !isBad { - // only report error if it's a new one - p.error(p.safePos(x.End()), fmt.Sprintf("function must be invoked in %s statement", callType)) - } - return nil -} - -func (p *parser) parseGoStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "GoStmt")) - } - - pos := p.expect(token.GO) - call := p.parseCallExpr("go") - p.expectSemi() - if call == nil { - return &ast.BadStmt{From: pos, To: pos + 2} // len("go") - } - - return &ast.GoStmt{Go: pos, Call: call} -} - -func (p *parser) parseDeferStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "DeferStmt")) - } - - pos := p.expect(token.DEFER) - call := p.parseCallExpr("defer") - p.expectSemi() - if call == nil { - return &ast.BadStmt{From: pos, To: pos + 5} // len("defer") - } - - return &ast.DeferStmt{Defer: pos, Call: call} -} - -func (p *parser) parseReturnStmt() *ast.ReturnStmt { - if p.trace { - defer un(trace(p, "ReturnStmt")) - } - - pos := p.pos - p.expect(token.RETURN) - var x []ast.Expr - if p.tok != token.SEMICOLON && p.tok != token.RBRACE { - x = p.parseList(true) - } - p.expectSemi() - - return &ast.ReturnStmt{Return: pos, Results: x} -} - -func (p *parser) parseBranchStmt(tok token.Token) *ast.BranchStmt { - if p.trace { - defer un(trace(p, "BranchStmt")) - } - - pos := p.expect(tok) - var label *ast.Ident - if tok != token.FALLTHROUGH && p.tok == token.IDENT { - label = p.parseIdent() - } - p.expectSemi() - - return &ast.BranchStmt{TokPos: pos, Tok: tok, Label: label} -} - -func (p *parser) makeExpr(s ast.Stmt, want string) ast.Expr { - if s == nil { - return nil - } - if es, isExpr := s.(*ast.ExprStmt); isExpr { - return p.checkExpr(es.X) - } - found := "simple statement" - if _, isAss := s.(*ast.AssignStmt); isAss { - found = "assignment" - } - p.error(s.Pos(), fmt.Sprintf("expected %s, found %s (missing parentheses around composite literal?)", want, found)) - return &ast.BadExpr{From: s.Pos(), To: p.safePos(s.End())} -} - -// parseIfHeader is an adjusted version of parser.header -// in cmd/compile/internal/syntax/parser.go, which has -// been tuned for better error handling. -func (p *parser) parseIfHeader() (init ast.Stmt, cond ast.Expr) { - if p.tok == token.LBRACE { - p.error(p.pos, "missing condition in if statement") - cond = &ast.BadExpr{From: p.pos, To: p.pos} - return - } - // p.tok != token.LBRACE - - prevLev := p.exprLev - p.exprLev = -1 - - if p.tok != token.SEMICOLON { - // accept potential variable declaration but complain - if p.tok == token.VAR { - p.next() - p.error(p.pos, "var declaration not allowed in 'IF' initializer") - } - init, _ = p.parseSimpleStmt(basic) - } - - var condStmt ast.Stmt - var semi struct { - pos token.Pos - lit string // ";" or "\n"; valid if pos.IsValid() - } - if p.tok != token.LBRACE { - if p.tok == token.SEMICOLON { - semi.pos = p.pos - semi.lit = p.lit - p.next() - } else { - p.expect(token.SEMICOLON) - } - if p.tok != token.LBRACE { - condStmt, _ = p.parseSimpleStmt(basic) - } - } else { - condStmt = init - init = nil - } - - if condStmt != nil { - cond = p.makeExpr(condStmt, "boolean expression") - } else if semi.pos.IsValid() { - if semi.lit == "\n" { - p.error(semi.pos, "unexpected newline, expecting { after if clause") - } else { - p.error(semi.pos, "missing condition in if statement") - } - } - - // make sure we have a valid AST - if cond == nil { - cond = &ast.BadExpr{From: p.pos, To: p.pos} - } - - p.exprLev = prevLev - return -} - -func (p *parser) parseIfStmt() *ast.IfStmt { - defer decNestLev(incNestLev(p)) - - if p.trace { - defer un(trace(p, "IfStmt")) - } - - pos := p.expect(token.IF) - - init, cond := p.parseIfHeader() - body := p.parseBlockStmt() - - var else_ ast.Stmt - if p.tok == token.ELSE { - p.next() - switch p.tok { - case token.IF: - else_ = p.parseIfStmt() - case token.LBRACE: - else_ = p.parseBlockStmt() - p.expectSemi() - default: - p.errorExpected(p.pos, "if statement or block") - else_ = &ast.BadStmt{From: p.pos, To: p.pos} - } - } else { - p.expectSemi() - } - - return &ast.IfStmt{If: pos, Init: init, Cond: cond, Body: body, Else: else_} -} - -func (p *parser) parseTypeList() (list []ast.Expr) { - if p.trace { - defer un(trace(p, "TypeList")) - } - - list = append(list, p.parseType()) - for p.tok == token.COMMA { - p.next() - list = append(list, p.parseType()) - } - - return -} - -func (p *parser) parseCaseClause(typeSwitch bool) *ast.CaseClause { - if p.trace { - defer un(trace(p, "CaseClause")) - } - - pos := p.pos - var list []ast.Expr - if p.tok == token.CASE { - p.next() - if typeSwitch { - list = p.parseTypeList() - } else { - list = p.parseList(true) - } - } else { - p.expect(token.DEFAULT) - } - - colon := p.expect(token.COLON) - body := p.parseStmtList() - - return &ast.CaseClause{Case: pos, List: list, Colon: colon, Body: body} -} - -func isTypeSwitchAssert(x ast.Expr) bool { - a, ok := x.(*ast.TypeAssertExpr) - return ok && a.Type == nil -} - -func (p *parser) isTypeSwitchGuard(s ast.Stmt) bool { - switch t := s.(type) { - case *ast.ExprStmt: - // x.(type) - return isTypeSwitchAssert(t.X) - case *ast.AssignStmt: - // v := x.(type) - if len(t.Lhs) == 1 && len(t.Rhs) == 1 && isTypeSwitchAssert(t.Rhs[0]) { - switch t.Tok { - case token.ASSIGN: - // permit v = x.(type) but complain - p.error(t.TokPos, "expected ':=', found '='") - fallthrough - case token.DEFINE: - return true - } - } - } - return false -} - -func (p *parser) parseSwitchStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "SwitchStmt")) - } - - pos := p.expect(token.SWITCH) - - var s1, s2 ast.Stmt - if p.tok != token.LBRACE { - prevLev := p.exprLev - p.exprLev = -1 - if p.tok != token.SEMICOLON { - s2, _ = p.parseSimpleStmt(basic) - } - if p.tok == token.SEMICOLON { - p.next() - s1 = s2 - s2 = nil - if p.tok != token.LBRACE { - // A TypeSwitchGuard may declare a variable in addition - // to the variable declared in the initial SimpleStmt. - // Introduce extra scope to avoid redeclaration errors: - // - // switch t := 0; t := x.(T) { ... } - // - // (this code is not valid Go because the first t - // cannot be accessed and thus is never used, the extra - // scope is needed for the correct error message). - // - // If we don't have a type switch, s2 must be an expression. - // Having the extra nested but empty scope won't affect it. - s2, _ = p.parseSimpleStmt(basic) - } - } - p.exprLev = prevLev - } - - typeSwitch := p.isTypeSwitchGuard(s2) - lbrace := p.expect(token.LBRACE) - var list []ast.Stmt - for p.tok == token.CASE || p.tok == token.DEFAULT { - list = append(list, p.parseCaseClause(typeSwitch)) - } - rbrace := p.expect(token.RBRACE) - p.expectSemi() - body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace} - - if typeSwitch { - return &ast.TypeSwitchStmt{Switch: pos, Init: s1, Assign: s2, Body: body} - } - - return &ast.SwitchStmt{Switch: pos, Init: s1, Tag: p.makeExpr(s2, "switch expression"), Body: body} -} - -func (p *parser) parseCommClause() *ast.CommClause { - if p.trace { - defer un(trace(p, "CommClause")) - } - - pos := p.pos - var comm ast.Stmt - if p.tok == token.CASE { - p.next() - lhs := p.parseList(false) - if p.tok == token.ARROW { - // SendStmt - if len(lhs) > 1 { - p.errorExpected(lhs[0].Pos(), "1 expression") - // continue with first expression - } - arrow := p.pos - p.next() - rhs := p.parseRhs() - comm = &ast.SendStmt{Chan: lhs[0], Arrow: arrow, Value: rhs} - } else { - // RecvStmt - if tok := p.tok; tok == token.ASSIGN || tok == token.DEFINE { - // RecvStmt with assignment - if len(lhs) > 2 { - p.errorExpected(lhs[0].Pos(), "1 or 2 expressions") - // continue with first two expressions - lhs = lhs[0:2] - } - pos := p.pos - p.next() - rhs := p.parseRhs() - as := &ast.AssignStmt{Lhs: lhs, TokPos: pos, Tok: tok, Rhs: []ast.Expr{rhs}} - if tok == token.DEFINE { - p.checkAssignStmt(as) - } - comm = as - } else { - // lhs must be single receive operation - if len(lhs) > 1 { - p.errorExpected(lhs[0].Pos(), "1 expression") - // continue with first expression - } - comm = &ast.ExprStmt{X: lhs[0]} - } - } - } else { - p.expect(token.DEFAULT) - } - - colon := p.expect(token.COLON) - body := p.parseStmtList() - - return &ast.CommClause{Case: pos, Comm: comm, Colon: colon, Body: body} -} - -func (p *parser) parseSelectStmt() *ast.SelectStmt { - if p.trace { - defer un(trace(p, "SelectStmt")) - } - - pos := p.expect(token.SELECT) - lbrace := p.expect(token.LBRACE) - var list []ast.Stmt - for p.tok == token.CASE || p.tok == token.DEFAULT { - list = append(list, p.parseCommClause()) - } - rbrace := p.expect(token.RBRACE) - p.expectSemi() - body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace} - - return &ast.SelectStmt{Select: pos, Body: body} -} - -func (p *parser) parseForStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "ForStmt")) - } - - pos := p.expect(token.FOR) - - var s1, s2, s3 ast.Stmt - var isRange bool - if p.tok != token.LBRACE { - prevLev := p.exprLev - p.exprLev = -1 - if p.tok != token.SEMICOLON { - if p.tok == token.RANGE { - // "for range x" (nil lhs in assignment) - pos := p.pos - p.next() - y := []ast.Expr{&ast.UnaryExpr{OpPos: pos, Op: token.RANGE, X: p.parseRhs()}} - s2 = &ast.AssignStmt{Rhs: y} - isRange = true - } else { - s2, isRange = p.parseSimpleStmt(rangeOk) - } - } - if !isRange && p.tok == token.SEMICOLON { - p.next() - s1 = s2 - s2 = nil - if p.tok != token.SEMICOLON { - s2, _ = p.parseSimpleStmt(basic) - } - p.expectSemi() - if p.tok != token.LBRACE { - s3, _ = p.parseSimpleStmt(basic) - } - } - p.exprLev = prevLev - } - - body := p.parseBlockStmt() - p.expectSemi() - - if isRange { - as := s2.(*ast.AssignStmt) - // check lhs - var key, value ast.Expr - switch len(as.Lhs) { - case 0: - // nothing to do - case 1: - key = as.Lhs[0] - case 2: - key, value = as.Lhs[0], as.Lhs[1] - default: - p.errorExpected(as.Lhs[len(as.Lhs)-1].Pos(), "at most 2 expressions") - return &ast.BadStmt{From: pos, To: p.safePos(body.End())} - } - // parseSimpleStmt returned a right-hand side that - // is a single unary expression of the form "range x" - x := as.Rhs[0].(*ast.UnaryExpr).X - return &ast.RangeStmt{ - For: pos, - Key: key, - Value: value, - TokPos: as.TokPos, - Tok: as.Tok, - X: x, - Body: body, - } - } - - // regular for statement - return &ast.ForStmt{ - For: pos, - Init: s1, - Cond: p.makeExpr(s2, "boolean or range expression"), - Post: s3, - Body: body, - } -} - -func (p *parser) parseStmt() (s ast.Stmt) { - defer decNestLev(incNestLev(p)) - - if p.trace { - defer un(trace(p, "Statement")) - } - - switch p.tok { - case token.CONST, token.TYPE, token.VAR: - s = &ast.DeclStmt{Decl: p.parseDecl(stmtStart)} - case - // tokens that may start an expression - token.IDENT, token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING, token.FUNC, token.LPAREN, // operands - token.LBRACK, token.STRUCT, token.MAP, token.CHAN, token.INTERFACE, // composite types - token.ADD, token.SUB, token.MUL, token.AND, token.XOR, token.ARROW, token.NOT: // unary operators - s, _ = p.parseSimpleStmt(labelOk) - // because of the required look-ahead, labeled statements are - // parsed by parseSimpleStmt - don't expect a semicolon after - // them - if _, isLabeledStmt := s.(*ast.LabeledStmt); !isLabeledStmt { - p.expectSemi() - } - case token.GO: - s = p.parseGoStmt() - case token.DEFER: - s = p.parseDeferStmt() - case token.RETURN: - s = p.parseReturnStmt() - case token.BREAK, token.CONTINUE, token.GOTO, token.FALLTHROUGH: - s = p.parseBranchStmt(p.tok) - case token.LBRACE: - s = p.parseBlockStmt() - p.expectSemi() - case token.IF: - s = p.parseIfStmt() - case token.SWITCH: - s = p.parseSwitchStmt() - case token.SELECT: - s = p.parseSelectStmt() - case token.FOR: - s = p.parseForStmt() - case token.SEMICOLON: - // Is it ever possible to have an implicit semicolon - // producing an empty statement in a valid program? - // (handle correctly anyway) - s = &ast.EmptyStmt{Semicolon: p.pos, Implicit: p.lit == "\n"} - p.next() - case token.RBRACE: - // a semicolon may be omitted before a closing "}" - s = &ast.EmptyStmt{Semicolon: p.pos, Implicit: true} - default: - // no statement found - pos := p.pos - p.errorExpected(pos, "statement") - p.advance(stmtStart) - s = &ast.BadStmt{From: pos, To: p.pos} - } - - return -} - -// ---------------------------------------------------------------------------- -// Declarations - -type parseSpecFunction func(doc *ast.CommentGroup, pos token.Pos, keyword token.Token, iota int) ast.Spec - -func isValidImport(lit string) bool { - const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD" - s, _ := strconv.Unquote(lit) // go/scanner returns a legal string literal - for _, r := range s { - if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) { - return false - } - } - return s != "" -} - -func (p *parser) parseImportSpec(doc *ast.CommentGroup, _ token.Pos, _ token.Token, _ int) ast.Spec { - if p.trace { - defer un(trace(p, "ImportSpec")) - } - - var ident *ast.Ident - switch p.tok { - case token.PERIOD: - ident = &ast.Ident{NamePos: p.pos, Name: "."} - p.next() - case token.IDENT: - ident = p.parseIdent() - } - - pos := p.pos - var path string - if p.tok == token.STRING { - path = p.lit - if !isValidImport(path) { - p.error(pos, "invalid import path: "+path) - } - p.next() - } else { - p.expect(token.STRING) // use expect() error handling - } - p.expectSemi() // call before accessing p.linecomment - - // collect imports - spec := &ast.ImportSpec{ - Doc: doc, - Name: ident, - Path: &ast.BasicLit{ValuePos: pos, Kind: token.STRING, Value: path}, - Comment: p.lineComment, - } - p.imports = append(p.imports, spec) - - return spec -} - -func (p *parser) parseValueSpec(doc *ast.CommentGroup, _ token.Pos, keyword token.Token, iota int) ast.Spec { - if p.trace { - defer un(trace(p, keyword.String()+"Spec")) - } - - pos := p.pos - idents := p.parseIdentList() - typ := p.tryIdentOrType() - var values []ast.Expr - // always permit optional initialization for more tolerant parsing - if p.tok == token.ASSIGN { - p.next() - values = p.parseList(true) - } - p.expectSemi() // call before accessing p.linecomment - - switch keyword { - case token.VAR: - if typ == nil && values == nil { - p.error(pos, "missing variable type or initialization") - } - case token.CONST: - if values == nil && (iota == 0 || typ != nil) { - p.error(pos, "missing constant value") - } - } - - spec := &ast.ValueSpec{ - Doc: doc, - Names: idents, - Type: typ, - Values: values, - Comment: p.lineComment, - } - return spec -} - -func (p *parser) parseGenericType(spec *ast.TypeSpec, openPos token.Pos, name0 *ast.Ident, typ0 ast.Expr) { - if p.trace { - defer un(trace(p, "parseGenericType")) - } - - list := p.parseParameterList(name0, typ0, token.RBRACK) - closePos := p.expect(token.RBRACK) - spec.TypeParams = &ast.FieldList{Opening: openPos, List: list, Closing: closePos} - // Let the type checker decide whether to accept type parameters on aliases: - // see issue #46477. - if p.tok == token.ASSIGN { - // type alias - spec.Assign = p.pos - p.next() - } - spec.Type = p.parseType() -} - -func (p *parser) parseTypeSpec(doc *ast.CommentGroup, _ token.Pos, _ token.Token, _ int) ast.Spec { - if p.trace { - defer un(trace(p, "TypeSpec")) - } - - name := p.parseIdent() - spec := &ast.TypeSpec{Doc: doc, Name: name} - - if p.tok == token.LBRACK && p.allowGenerics() { - // spec.Name "[" ... - // array/slice type or type parameter list - lbrack := p.pos - p.next() - if p.tok == token.IDENT { - // We may have an array type or a type parameter list. - // In either case we expect an expression x (which may - // just be a name, or a more complex expression) which - // we can analyze further. - // - // A type parameter list may have a type bound starting - // with a "[" as in: P []E. In that case, simply parsing - // an expression would lead to an error: P[] is invalid. - // But since index or slice expressions are never constant - // and thus invalid array length expressions, if the name - // is followed by "[" it must be the start of an array or - // slice constraint. Only if we don't see a "[" do we - // need to parse a full expression. Notably, name <- x - // is not a concern because name <- x is a statement and - // not an expression. - var x ast.Expr = p.parseIdent() - if p.tok != token.LBRACK { - // To parse the expression starting with name, expand - // the call sequence we would get by passing in name - // to parser.expr, and pass in name to parsePrimaryExpr. - p.exprLev++ - lhs := p.parsePrimaryExpr(x) - x = p.parseBinaryExpr(lhs, token.LowestPrec+1, false) - p.exprLev-- - } - // Analyze expression x. If we can split x into a type parameter - // name, possibly followed by a type parameter type, we consider - // this the start of a type parameter list, with some caveats: - // a single name followed by "]" tilts the decision towards an - // array declaration; a type parameter type that could also be - // an ordinary expression but which is followed by a comma tilts - // the decision towards a type parameter list. - if pname, ptype := extractName(x, p.tok == token.COMMA); pname != nil && (ptype != nil || p.tok != token.RBRACK) { - // spec.Name "[" pname ... - // spec.Name "[" pname ptype ... - // spec.Name "[" pname ptype "," ... - p.parseGenericType(spec, lbrack, pname, ptype) // ptype may be nil - } else { - // spec.Name "[" pname "]" ... - // spec.Name "[" x ... - spec.Type = p.parseArrayType(lbrack, x) - } - } else { - // array type - spec.Type = p.parseArrayType(lbrack, nil) - } - } else { - // no type parameters - if p.tok == token.ASSIGN { - // type alias - spec.Assign = p.pos - p.next() - } - spec.Type = p.parseType() - } - - p.expectSemi() // call before accessing p.linecomment - spec.Comment = p.lineComment - - return spec -} - -// extractName splits the expression x into (name, expr) if syntactically -// x can be written as name expr. The split only happens if expr is a type -// element (per the isTypeElem predicate) or if force is set. -// If x is just a name, the result is (name, nil). If the split succeeds, -// the result is (name, expr). Otherwise the result is (nil, x). -// Examples: -// -// x force name expr -// ------------------------------------ -// P*[]int T/F P *[]int -// P*E T P *E -// P*E F nil P*E -// P([]int) T/F P []int -// P(E) T P E -// P(E) F nil P(E) -// P*E|F|~G T/F P *E|F|~G -// P*E|F|G T P *E|F|G -// P*E|F|G F nil P*E|F|G -func extractName(x ast.Expr, force bool) (*ast.Ident, ast.Expr) { - switch x := x.(type) { - case *ast.Ident: - return x, nil - case *ast.BinaryExpr: - switch x.Op { - case token.MUL: - if name, _ := x.X.(*ast.Ident); name != nil && (force || isTypeElem(x.Y)) { - // x = name *x.Y - return name, &ast.StarExpr{Star: x.OpPos, X: x.Y} - } - case token.OR: - if name, lhs := extractName(x.X, force || isTypeElem(x.Y)); name != nil && lhs != nil { - // x = name lhs|x.Y - op := *x - op.X = lhs - return name, &op - } - } - case *ast.CallExpr: - if name, _ := x.Fun.(*ast.Ident); name != nil { - if len(x.Args) == 1 && x.Ellipsis == token.NoPos && (force || isTypeElem(x.Args[0])) { - // x = name "(" x.ArgList[0] ")" - return name, x.Args[0] - } - } - } - return nil, x -} - -// isTypeElem reports whether x is a (possibly parenthesized) type element expression. -// The result is false if x could be a type element OR an ordinary (value) expression. -func isTypeElem(x ast.Expr) bool { - switch x := x.(type) { - case *ast.ArrayType, *ast.StructType, *ast.FuncType, *ast.InterfaceType, *ast.MapType, *ast.ChanType: - return true - case *ast.BinaryExpr: - return isTypeElem(x.X) || isTypeElem(x.Y) - case *ast.UnaryExpr: - return x.Op == token.TILDE - case *ast.ParenExpr: - return isTypeElem(x.X) - } - return false -} - -func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.GenDecl { - if p.trace { - defer un(trace(p, "GenDecl("+keyword.String()+")")) - } - - doc := p.leadComment - pos := p.expect(keyword) - var lparen, rparen token.Pos - var list []ast.Spec - if p.tok == token.LPAREN { - lparen = p.pos - p.next() - for iota := 0; p.tok != token.RPAREN && p.tok != token.EOF; iota++ { - list = append(list, f(p.leadComment, pos, keyword, iota)) - } - rparen = p.expect(token.RPAREN) - p.expectSemi() - } else { - list = append(list, f(nil, pos, keyword, 0)) - } - - return &ast.GenDecl{ - Doc: doc, - TokPos: pos, - Tok: keyword, - Lparen: lparen, - Specs: list, - Rparen: rparen, - } -} - -func (p *parser) parseFuncDecl() *ast.FuncDecl { - if p.trace { - defer un(trace(p, "FunctionDecl")) - } - - doc := p.leadComment - pos := p.expect(token.FUNC) - - var recv *ast.FieldList - if p.tok == token.LPAREN { - _, recv = p.parseParameters(false) - } - - ident := p.parseIdent() - - tparams, params := p.parseParameters(true) - if recv != nil && tparams != nil { - // Method declarations do not have type parameters. We parse them for a - // better error message and improved error recovery. - p.error(tparams.Opening, "method must have no type parameters") - tparams = nil - } - results := p.parseResult() - - var body *ast.BlockStmt - switch p.tok { - case token.LBRACE: - body = p.parseBody() - p.expectSemi() - case token.SEMICOLON: - p.next() - if p.tok == token.LBRACE { - // opening { of function declaration on next line - p.error(p.pos, "unexpected semicolon or newline before {") - body = p.parseBody() - p.expectSemi() - } - default: - p.expectSemi() - } - - decl := &ast.FuncDecl{ - Doc: doc, - Recv: recv, - Name: ident, - Type: &ast.FuncType{ - Func: pos, - TypeParams: tparams, - Params: params, - Results: results, - }, - Body: body, - } - return decl -} - -func (p *parser) parseDecl(sync map[token.Token]bool) ast.Decl { - if p.trace { - defer un(trace(p, "Declaration")) - } - - var f parseSpecFunction - switch p.tok { - case token.CONST, token.VAR: - f = p.parseValueSpec - - case token.TYPE: - f = p.parseTypeSpec - - case token.FUNC: - return p.parseFuncDecl() - - default: - pos := p.pos - p.errorExpected(pos, "declaration") - p.advance(sync) - return &ast.BadDecl{From: pos, To: p.pos} - } - - return p.parseGenDecl(p.tok, f) -} - -// ---------------------------------------------------------------------------- -// Source files - -func (p *parser) parseFile() *ast.File { - if p.trace { - defer un(trace(p, "File")) - } - - // Don't bother parsing the rest if we had errors scanning the first token. - // Likely not a Go source file at all. - if p.errors.Len() != 0 { - return nil - } - - // package clause - doc := p.leadComment - pos := p.expect(token.PACKAGE) - // Go spec: The package clause is not a declaration; - // the package name does not appear in any scope. - ident := p.parseIdent() - if ident.Name == "_" && p.mode&DeclarationErrors != 0 { - p.error(p.pos, "invalid package name _") - } - p.expectSemi() - - // Don't bother parsing the rest if we had errors parsing the package clause. - // Likely not a Go source file at all. - if p.errors.Len() != 0 { - return nil - } - - var decls []ast.Decl - if p.mode&PackageClauseOnly == 0 { - // import decls - for p.tok == token.IMPORT { - decls = append(decls, p.parseGenDecl(token.IMPORT, p.parseImportSpec)) - } - - if p.mode&ImportsOnly == 0 { - // rest of package body - for p.tok != token.EOF { - decls = append(decls, p.parseDecl(declStart)) - } - } - } - - f := &ast.File{ - Doc: doc, - Package: pos, - Name: ident, - Decls: decls, - Imports: p.imports, - Comments: p.comments, - } - var declErr func(token.Pos, string) - if p.mode&DeclarationErrors != 0 { - declErr = p.error - } - if p.mode&SkipObjectResolution == 0 { - resolveFile(f, p.file, declErr) - } - - return f -} diff --git a/internal/backport/go/parser/parser_test.go b/internal/backport/go/parser/parser_test.go deleted file mode 100644 index feb05ea41c..0000000000 --- a/internal/backport/go/parser/parser_test.go +++ /dev/null @@ -1,579 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package parser - -import ( - "bytes" - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" - "io/fs" - "strings" - "testing" -) - -var validFiles = []string{ - "parser.go", - "parser_test.go", - "error_test.go", - "short_test.go", -} - -func TestParse(t *testing.T) { - for _, filename := range validFiles { - _, err := ParseFile(token.NewFileSet(), filename, nil, DeclarationErrors) - if err != nil { - t.Fatalf("ParseFile(%s): %v", filename, err) - } - } -} - -func nameFilter(filename string) bool { - switch filename { - case "parser.go", "interface.go", "parser_test.go": - return true - case "parser.go.orig": - return true // permit but should be ignored by ParseDir - } - return false -} - -func dirFilter(f fs.FileInfo) bool { return nameFilter(f.Name()) } - -func TestParseFile(t *testing.T) { - src := "package p\nvar _=s[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]" - _, err := ParseFile(token.NewFileSet(), "", src, 0) - if err == nil { - t.Errorf("ParseFile(%s) succeeded unexpectedly", src) - } -} - -func TestParseExprFrom(t *testing.T) { - src := "s[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]+\ns[::]" - _, err := ParseExprFrom(token.NewFileSet(), "", src, 0) - if err == nil { - t.Errorf("ParseExprFrom(%s) succeeded unexpectedly", src) - } -} - -func TestParseDir(t *testing.T) { - path := "." - pkgs, err := ParseDir(token.NewFileSet(), path, dirFilter, 0) - if err != nil { - t.Fatalf("ParseDir(%s): %v", path, err) - } - if n := len(pkgs); n != 1 { - t.Errorf("got %d packages; want 1", n) - } - pkg := pkgs["parser"] - if pkg == nil { - t.Errorf(`package "parser" not found`) - return - } - if n := len(pkg.Files); n != 3 { - t.Errorf("got %d package files; want 3", n) - } - for filename := range pkg.Files { - if !nameFilter(filename) { - t.Errorf("unexpected package file: %s", filename) - } - } -} - -func TestIssue42951(t *testing.T) { - path := "./testdata/issue42951" - _, err := ParseDir(token.NewFileSet(), path, nil, 0) - if err != nil { - t.Errorf("ParseDir(%s): %v", path, err) - } -} - -func TestParseExpr(t *testing.T) { - // just kicking the tires: - // a valid arithmetic expression - src := "a + b" - x, err := ParseExpr(src) - if err != nil { - t.Errorf("ParseExpr(%q): %v", src, err) - } - // sanity check - if _, ok := x.(*ast.BinaryExpr); !ok { - t.Errorf("ParseExpr(%q): got %T, want *ast.BinaryExpr", src, x) - } - - // a valid type expression - src = "struct{x *int}" - x, err = ParseExpr(src) - if err != nil { - t.Errorf("ParseExpr(%q): %v", src, err) - } - // sanity check - if _, ok := x.(*ast.StructType); !ok { - t.Errorf("ParseExpr(%q): got %T, want *ast.StructType", src, x) - } - - // an invalid expression - src = "a + *" - x, err = ParseExpr(src) - if err == nil { - t.Errorf("ParseExpr(%q): got no error", src) - } - if x == nil { - t.Errorf("ParseExpr(%q): got no (partial) result", src) - } - if _, ok := x.(*ast.BinaryExpr); !ok { - t.Errorf("ParseExpr(%q): got %T, want *ast.BinaryExpr", src, x) - } - - // a valid expression followed by extra tokens is invalid - src = "a[i] := x" - if _, err := ParseExpr(src); err == nil { - t.Errorf("ParseExpr(%q): got no error", src) - } - - // a semicolon is not permitted unless automatically inserted - src = "a + b\n" - if _, err := ParseExpr(src); err != nil { - t.Errorf("ParseExpr(%q): got error %s", src, err) - } - src = "a + b;" - if _, err := ParseExpr(src); err == nil { - t.Errorf("ParseExpr(%q): got no error", src) - } - - // various other stuff following a valid expression - const validExpr = "a + b" - const anything = "dh3*#D)#_" - for _, c := range "!)]};," { - src := validExpr + string(c) + anything - if _, err := ParseExpr(src); err == nil { - t.Errorf("ParseExpr(%q): got no error", src) - } - } - - // ParseExpr must not crash - for _, src := range valids { - ParseExpr(src) - } -} - -func TestColonEqualsScope(t *testing.T) { - f, err := ParseFile(token.NewFileSet(), "", `package p; func f() { x, y, z := x, y, z }`, 0) - if err != nil { - t.Fatal(err) - } - - // RHS refers to undefined globals; LHS does not. - as := f.Decls[0].(*ast.FuncDecl).Body.List[0].(*ast.AssignStmt) - for _, v := range as.Rhs { - id := v.(*ast.Ident) - if id.Obj != nil { - t.Errorf("rhs %s has Obj, should not", id.Name) - } - } - for _, v := range as.Lhs { - id := v.(*ast.Ident) - if id.Obj == nil { - t.Errorf("lhs %s does not have Obj, should", id.Name) - } - } -} - -func TestVarScope(t *testing.T) { - f, err := ParseFile(token.NewFileSet(), "", `package p; func f() { var x, y, z = x, y, z }`, 0) - if err != nil { - t.Fatal(err) - } - - // RHS refers to undefined globals; LHS does not. - as := f.Decls[0].(*ast.FuncDecl).Body.List[0].(*ast.DeclStmt).Decl.(*ast.GenDecl).Specs[0].(*ast.ValueSpec) - for _, v := range as.Values { - id := v.(*ast.Ident) - if id.Obj != nil { - t.Errorf("rhs %s has Obj, should not", id.Name) - } - } - for _, id := range as.Names { - if id.Obj == nil { - t.Errorf("lhs %s does not have Obj, should", id.Name) - } - } -} - -func TestObjects(t *testing.T) { - const src = ` -package p -import fmt "fmt" -const pi = 3.14 -type T struct{} -var x int -func f() { L: } -` - - f, err := ParseFile(token.NewFileSet(), "", src, 0) - if err != nil { - t.Fatal(err) - } - - objects := map[string]ast.ObjKind{ - "p": ast.Bad, // not in a scope - "fmt": ast.Bad, // not resolved yet - "pi": ast.Con, - "T": ast.Typ, - "x": ast.Var, - "int": ast.Bad, // not resolved yet - "f": ast.Fun, - "L": ast.Lbl, - } - - ast.Inspect(f, func(n ast.Node) bool { - if ident, ok := n.(*ast.Ident); ok { - obj := ident.Obj - if obj == nil { - if objects[ident.Name] != ast.Bad { - t.Errorf("no object for %s", ident.Name) - } - return true - } - if obj.Name != ident.Name { - t.Errorf("names don't match: obj.Name = %s, ident.Name = %s", obj.Name, ident.Name) - } - kind := objects[ident.Name] - if obj.Kind != kind { - t.Errorf("%s: obj.Kind = %s; want %s", ident.Name, obj.Kind, kind) - } - } - return true - }) -} - -func TestUnresolved(t *testing.T) { - f, err := ParseFile(token.NewFileSet(), "", ` -package p -// -func f1a(int) -func f2a(byte, int, float) -func f3a(a, b int, c float) -func f4a(...complex) -func f5a(a s1a, b ...complex) -// -func f1b(*int) -func f2b([]byte, (int), *float) -func f3b(a, b *int, c []float) -func f4b(...*complex) -func f5b(a s1a, b ...[]complex) -// -type s1a struct { int } -type s2a struct { byte; int; s1a } -type s3a struct { a, b int; c float } -// -type s1b struct { *int } -type s2b struct { byte; int; *float } -type s3b struct { a, b *s3b; c []float } -`, 0) - if err != nil { - t.Fatal(err) - } - - want := "int " + // f1a - "byte int float " + // f2a - "int float " + // f3a - "complex " + // f4a - "complex " + // f5a - // - "int " + // f1b - "byte int float " + // f2b - "int float " + // f3b - "complex " + // f4b - "complex " + // f5b - // - "int " + // s1a - "byte int " + // s2a - "int float " + // s3a - // - "int " + // s1a - "byte int float " + // s2a - "float " // s3a - - // collect unresolved identifiers - var buf bytes.Buffer - for _, u := range f.Unresolved { - buf.WriteString(u.Name) - buf.WriteByte(' ') - } - got := buf.String() - - if got != want { - t.Errorf("\ngot: %s\nwant: %s", got, want) - } -} - -var imports = map[string]bool{ - `"a"`: true, - "`a`": true, - `"a/b"`: true, - `"a.b"`: true, - `"m\x61th"`: true, - `"greek/αβ"`: true, - `""`: false, - - // Each of these pairs tests both `` vs "" strings - // and also use of invalid characters spelled out as - // escape sequences and written directly. - // For example `"\x00"` tests import "\x00" - // while "`\x00`" tests import ``. - `"\x00"`: false, - "`\x00`": false, - `"\x7f"`: false, - "`\x7f`": false, - `"a!"`: false, - "`a!`": false, - `"a b"`: false, - "`a b`": false, - `"a\\b"`: false, - "`a\\b`": false, - "\"`a`\"": false, - "`\"a\"`": false, - `"\x80\x80"`: false, - "`\x80\x80`": false, - `"\xFFFD"`: false, - "`\xFFFD`": false, -} - -func TestImports(t *testing.T) { - for path, isValid := range imports { - src := fmt.Sprintf("package p; import %s", path) - _, err := ParseFile(token.NewFileSet(), "", src, 0) - switch { - case err != nil && isValid: - t.Errorf("ParseFile(%s): got %v; expected no error", src, err) - case err == nil && !isValid: - t.Errorf("ParseFile(%s): got no error; expected one", src) - } - } -} - -func TestCommentGroups(t *testing.T) { - f, err := ParseFile(token.NewFileSet(), "", ` -package p /* 1a */ /* 1b */ /* 1c */ // 1d -/* 2a -*/ -// 2b -const pi = 3.1415 -/* 3a */ // 3b -/* 3c */ const e = 2.7182 - -// Example from issue 3139 -func ExampleCount() { - fmt.Println(strings.Count("cheese", "e")) - fmt.Println(strings.Count("five", "")) // before & after each rune - // Output: - // 3 - // 5 -} -`, ParseComments) - if err != nil { - t.Fatal(err) - } - expected := [][]string{ - {"/* 1a */", "/* 1b */", "/* 1c */", "// 1d"}, - {"/* 2a\n*/", "// 2b"}, - {"/* 3a */", "// 3b", "/* 3c */"}, - {"// Example from issue 3139"}, - {"// before & after each rune"}, - {"// Output:", "// 3", "// 5"}, - } - if len(f.Comments) != len(expected) { - t.Fatalf("got %d comment groups; expected %d", len(f.Comments), len(expected)) - } - for i, exp := range expected { - got := f.Comments[i].List - if len(got) != len(exp) { - t.Errorf("got %d comments in group %d; expected %d", len(got), i, len(exp)) - continue - } - for j, exp := range exp { - got := got[j].Text - if got != exp { - t.Errorf("got %q in group %d; expected %q", got, i, exp) - } - } - } -} - -func getField(file *ast.File, fieldname string) *ast.Field { - parts := strings.Split(fieldname, ".") - for _, d := range file.Decls { - if d, ok := d.(*ast.GenDecl); ok && d.Tok == token.TYPE { - for _, s := range d.Specs { - if s, ok := s.(*ast.TypeSpec); ok && s.Name.Name == parts[0] { - if s, ok := s.Type.(*ast.StructType); ok { - for _, f := range s.Fields.List { - for _, name := range f.Names { - if name.Name == parts[1] { - return f - } - } - } - } - } - } - } - } - return nil -} - -// Don't use ast.CommentGroup.Text() - we want to see exact comment text. -func commentText(c *ast.CommentGroup) string { - var buf bytes.Buffer - if c != nil { - for _, c := range c.List { - buf.WriteString(c.Text) - } - } - return buf.String() -} - -func checkFieldComments(t *testing.T, file *ast.File, fieldname, lead, line string) { - f := getField(file, fieldname) - if f == nil { - t.Fatalf("field not found: %s", fieldname) - } - if got := commentText(f.Doc); got != lead { - t.Errorf("got lead comment %q; expected %q", got, lead) - } - if got := commentText(f.Comment); got != line { - t.Errorf("got line comment %q; expected %q", got, line) - } -} - -func TestLeadAndLineComments(t *testing.T) { - f, err := ParseFile(token.NewFileSet(), "", ` -package p -type T struct { - /* F1 lead comment */ - // - F1 int /* F1 */ // line comment - // F2 lead - // comment - F2 int // F2 line comment - // f3 lead comment - f3 int // f3 line comment -} -`, ParseComments) - if err != nil { - t.Fatal(err) - } - checkFieldComments(t, f, "T.F1", "/* F1 lead comment *///", "/* F1 */// line comment") - checkFieldComments(t, f, "T.F2", "// F2 lead// comment", "// F2 line comment") - checkFieldComments(t, f, "T.f3", "// f3 lead comment", "// f3 line comment") - ast.FileExports(f) - checkFieldComments(t, f, "T.F1", "/* F1 lead comment *///", "/* F1 */// line comment") - checkFieldComments(t, f, "T.F2", "// F2 lead// comment", "// F2 line comment") - if getField(f, "T.f3") != nil { - t.Error("not expected to find T.f3") - } -} - -// TestIssue9979 verifies that empty statements are contained within their enclosing blocks. -func TestIssue9979(t *testing.T) { - for _, src := range []string{ - "package p; func f() {;}", - "package p; func f() {L:}", - "package p; func f() {L:;}", - "package p; func f() {L:\n}", - "package p; func f() {L:\n;}", - "package p; func f() { ; }", - "package p; func f() { L: }", - "package p; func f() { L: ; }", - "package p; func f() { L: \n}", - "package p; func f() { L: \n; }", - } { - fset := token.NewFileSet() - f, err := ParseFile(fset, "", src, 0) - if err != nil { - t.Fatal(err) - } - - var pos, end token.Pos - ast.Inspect(f, func(x ast.Node) bool { - switch s := x.(type) { - case *ast.BlockStmt: - pos, end = s.Pos()+1, s.End()-1 // exclude "{", "}" - case *ast.LabeledStmt: - pos, end = s.Pos()+2, s.End() // exclude "L:" - case *ast.EmptyStmt: - // check containment - if s.Pos() < pos || s.End() > end { - t.Errorf("%s: %T[%d, %d] not inside [%d, %d]", src, s, s.Pos(), s.End(), pos, end) - } - // check semicolon - offs := fset.Position(s.Pos()).Offset - if ch := src[offs]; ch != ';' != s.Implicit { - want := "want ';'" - if s.Implicit { - want = "but ';' is implicit" - } - t.Errorf("%s: found %q at offset %d; %s", src, ch, offs, want) - } - } - return true - }) - } -} - -// TestIncompleteSelection ensures that an incomplete selector -// expression is parsed as a (blank) *ast.SelectorExpr, not a -// *ast.BadExpr. -func TestIncompleteSelection(t *testing.T) { - for _, src := range []string{ - "package p; var _ = fmt.", // at EOF - "package p; var _ = fmt.\ntype X int", // not at EOF - } { - fset := token.NewFileSet() - f, err := ParseFile(fset, "", src, 0) - if err == nil { - t.Errorf("ParseFile(%s) succeeded unexpectedly", src) - continue - } - - const wantErr = "expected selector or type assertion" - if !strings.Contains(err.Error(), wantErr) { - t.Errorf("ParseFile returned wrong error %q, want %q", err, wantErr) - } - - var sel *ast.SelectorExpr - ast.Inspect(f, func(n ast.Node) bool { - if n, ok := n.(*ast.SelectorExpr); ok { - sel = n - } - return true - }) - if sel == nil { - t.Error("found no *ast.SelectorExpr") - continue - } - const wantSel = "&{fmt _}" - if fmt.Sprint(sel) != wantSel { - t.Errorf("found selector %s, want %s", sel, wantSel) - continue - } - } -} - -func TestLastLineComment(t *testing.T) { - const src = `package main -type x int // comment -` - fset := token.NewFileSet() - f, err := ParseFile(fset, "", src, ParseComments) - if err != nil { - t.Fatal(err) - } - comment := f.Decls[0].(*ast.GenDecl).Specs[0].(*ast.TypeSpec).Comment.List[0].Text - if comment != "// comment" { - t.Errorf("got %q, want %q", comment, "// comment") - } -} diff --git a/internal/backport/go/parser/performance_test.go b/internal/backport/go/parser/performance_test.go deleted file mode 100644 index 8b219f162a..0000000000 --- a/internal/backport/go/parser/performance_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package parser - -import ( - "os" - "testing" - - "golang.org/x/website/internal/backport/go/token" -) - -// TODO(rfindley): use a testdata file or file from another package here, to -// avoid a moving target. -var src = readFile("parser.go") - -func readFile(filename string) []byte { - data, err := os.ReadFile(filename) - if err != nil { - panic(err) - } - return data -} - -func BenchmarkParse(b *testing.B) { - b.SetBytes(int64(len(src))) - for i := 0; i < b.N; i++ { - if _, err := ParseFile(token.NewFileSet(), "", src, ParseComments); err != nil { - b.Fatalf("benchmark failed due to parse error: %s", err) - } - } -} - -func BenchmarkParseOnly(b *testing.B) { - b.SetBytes(int64(len(src))) - for i := 0; i < b.N; i++ { - if _, err := ParseFile(token.NewFileSet(), "", src, ParseComments|SkipObjectResolution); err != nil { - b.Fatalf("benchmark failed due to parse error: %s", err) - } - } -} - -func BenchmarkResolve(b *testing.B) { - b.SetBytes(int64(len(src))) - for i := 0; i < b.N; i++ { - b.StopTimer() - fset := token.NewFileSet() - file, err := ParseFile(fset, "", src, SkipObjectResolution) - if err != nil { - b.Fatalf("benchmark failed due to parse error: %s", err) - } - b.StartTimer() - handle := fset.File(file.Package) - resolveFile(file, handle, nil) - } -} diff --git a/internal/backport/go/parser/resolver.go b/internal/backport/go/parser/resolver.go deleted file mode 100644 index b648836318..0000000000 --- a/internal/backport/go/parser/resolver.go +++ /dev/null @@ -1,607 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package parser - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" - "strings" -) - -const debugResolve = false - -// resolveFile walks the given file to resolve identifiers within the file -// scope, updating ast.Ident.Obj fields with declaration information. -// -// If declErr is non-nil, it is used to report declaration errors during -// resolution. tok is used to format position in error messages. -func resolveFile(file *ast.File, handle *token.File, declErr func(token.Pos, string)) { - pkgScope := ast.NewScope(nil) - r := &resolver{ - handle: handle, - declErr: declErr, - topScope: pkgScope, - pkgScope: pkgScope, - depth: 1, - } - - for _, decl := range file.Decls { - ast.Walk(r, decl) - } - - r.closeScope() - assert(r.topScope == nil, "unbalanced scopes") - assert(r.labelScope == nil, "unbalanced label scopes") - - // resolve global identifiers within the same file - i := 0 - for _, ident := range r.unresolved { - // i <= index for current ident - assert(ident.Obj == unresolved, "object already resolved") - ident.Obj = r.pkgScope.Lookup(ident.Name) // also removes unresolved sentinel - if ident.Obj == nil { - r.unresolved[i] = ident - i++ - } else if debugResolve { - pos := ident.Obj.Decl.(interface{ Pos() token.Pos }).Pos() - r.trace("resolved %s@%v to package object %v", ident.Name, ident.Pos(), pos) - } - } - file.Scope = r.pkgScope - file.Unresolved = r.unresolved[0:i] -} - -type resolver struct { - handle *token.File - declErr func(token.Pos, string) - - // Ordinary identifier scopes - pkgScope *ast.Scope // pkgScope.Outer == nil - topScope *ast.Scope // top-most scope; may be pkgScope - unresolved []*ast.Ident // unresolved identifiers - depth int // scope depth - - // Label scopes - // (maintained by open/close LabelScope) - labelScope *ast.Scope // label scope for current function - targetStack [][]*ast.Ident // stack of unresolved labels -} - -func (r *resolver) trace(format string, args ...interface{}) { - fmt.Println(strings.Repeat(". ", r.depth) + r.sprintf(format, args...)) -} - -func (r *resolver) sprintf(format string, args ...interface{}) string { - for i, arg := range args { - switch arg := arg.(type) { - case token.Pos: - args[i] = r.handle.Position(arg) - } - } - return fmt.Sprintf(format, args...) -} - -func (r *resolver) openScope(pos token.Pos) { - if debugResolve { - r.trace("opening scope @%v", pos) - r.depth++ - } - r.topScope = ast.NewScope(r.topScope) -} - -func (r *resolver) closeScope() { - if debugResolve { - r.depth-- - r.trace("closing scope") - } - r.topScope = r.topScope.Outer -} - -func (r *resolver) openLabelScope() { - r.labelScope = ast.NewScope(r.labelScope) - r.targetStack = append(r.targetStack, nil) -} - -func (r *resolver) closeLabelScope() { - // resolve labels - n := len(r.targetStack) - 1 - scope := r.labelScope - for _, ident := range r.targetStack[n] { - ident.Obj = scope.Lookup(ident.Name) - if ident.Obj == nil && r.declErr != nil { - r.declErr(ident.Pos(), fmt.Sprintf("label %s undefined", ident.Name)) - } - } - // pop label scope - r.targetStack = r.targetStack[0:n] - r.labelScope = r.labelScope.Outer -} - -func (r *resolver) declare(decl, data interface{}, scope *ast.Scope, kind ast.ObjKind, idents ...*ast.Ident) { - for _, ident := range idents { - if ident.Obj != nil { - panic(fmt.Sprintf("%v: identifier %s already declared or resolved", ident.Pos(), ident.Name)) - } - obj := ast.NewObj(kind, ident.Name) - // remember the corresponding declaration for redeclaration - // errors and global variable resolution/typechecking phase - obj.Decl = decl - obj.Data = data - // Identifiers (for receiver type parameters) are written to the scope, but - // never set as the resolved object. See issue #50956. - if _, ok := decl.(*ast.Ident); !ok { - ident.Obj = obj - } - if ident.Name != "_" { - if debugResolve { - r.trace("declaring %s@%v", ident.Name, ident.Pos()) - } - if alt := scope.Insert(obj); alt != nil && r.declErr != nil { - prevDecl := "" - if pos := alt.Pos(); pos.IsValid() { - prevDecl = r.sprintf("\n\tprevious declaration at %v", pos) - } - r.declErr(ident.Pos(), fmt.Sprintf("%s redeclared in this block%s", ident.Name, prevDecl)) - } - } - } -} - -func (r *resolver) shortVarDecl(decl *ast.AssignStmt) { - // Go spec: A short variable declaration may redeclare variables - // provided they were originally declared in the same block with - // the same type, and at least one of the non-blank variables is new. - n := 0 // number of new variables - for _, x := range decl.Lhs { - if ident, isIdent := x.(*ast.Ident); isIdent { - assert(ident.Obj == nil, "identifier already declared or resolved") - obj := ast.NewObj(ast.Var, ident.Name) - // remember corresponding assignment for other tools - obj.Decl = decl - ident.Obj = obj - if ident.Name != "_" { - if debugResolve { - r.trace("declaring %s@%v", ident.Name, ident.Pos()) - } - if alt := r.topScope.Insert(obj); alt != nil { - ident.Obj = alt // redeclaration - } else { - n++ // new declaration - } - } - } - } - if n == 0 && r.declErr != nil { - r.declErr(decl.Lhs[0].Pos(), "no new variables on left side of :=") - } -} - -// The unresolved object is a sentinel to mark identifiers that have been added -// to the list of unresolved identifiers. The sentinel is only used for verifying -// internal consistency. -var unresolved = new(ast.Object) - -// If x is an identifier, resolve attempts to resolve x by looking up -// the object it denotes. If no object is found and collectUnresolved is -// set, x is marked as unresolved and collected in the list of unresolved -// identifiers. -func (r *resolver) resolve(ident *ast.Ident, collectUnresolved bool) { - if ident.Obj != nil { - panic(r.sprintf("%v: identifier %s already declared or resolved", ident.Pos(), ident.Name)) - } - // '_' should never refer to existing declarations, because it has special - // handling in the spec. - if ident.Name == "_" { - return - } - for s := r.topScope; s != nil; s = s.Outer { - if obj := s.Lookup(ident.Name); obj != nil { - if debugResolve { - r.trace("resolved %v:%s to %v", ident.Pos(), ident.Name, obj) - } - assert(obj.Name != "", "obj with no name") - // Identifiers (for receiver type parameters) are written to the scope, - // but never set as the resolved object. See issue #50956. - if _, ok := obj.Decl.(*ast.Ident); !ok { - ident.Obj = obj - } - return - } - } - // all local scopes are known, so any unresolved identifier - // must be found either in the file scope, package scope - // (perhaps in another file), or universe scope --- collect - // them so that they can be resolved later - if collectUnresolved { - ident.Obj = unresolved - r.unresolved = append(r.unresolved, ident) - } -} - -func (r *resolver) walkExprs(list []ast.Expr) { - for _, node := range list { - ast.Walk(r, node) - } -} - -func (r *resolver) walkLHS(list []ast.Expr) { - for _, expr := range list { - expr := unparen(expr) - if _, ok := expr.(*ast.Ident); !ok && expr != nil { - ast.Walk(r, expr) - } - } -} - -func (r *resolver) walkStmts(list []ast.Stmt) { - for _, stmt := range list { - ast.Walk(r, stmt) - } -} - -func (r *resolver) Visit(node ast.Node) ast.Visitor { - if debugResolve && node != nil { - r.trace("node %T@%v", node, node.Pos()) - } - - switch n := node.(type) { - - // Expressions. - case *ast.Ident: - r.resolve(n, true) - - case *ast.FuncLit: - r.openScope(n.Pos()) - defer r.closeScope() - r.walkFuncType(n.Type) - r.walkBody(n.Body) - - case *ast.SelectorExpr: - ast.Walk(r, n.X) - // Note: don't try to resolve n.Sel, as we don't support qualified - // resolution. - - case *ast.StructType: - r.openScope(n.Pos()) - defer r.closeScope() - r.walkFieldList(n.Fields, ast.Var) - - case *ast.FuncType: - r.openScope(n.Pos()) - defer r.closeScope() - r.walkFuncType(n) - - case *ast.CompositeLit: - if n.Type != nil { - ast.Walk(r, n.Type) - } - for _, e := range n.Elts { - if kv, _ := e.(*ast.KeyValueExpr); kv != nil { - // See issue #45160: try to resolve composite lit keys, but don't - // collect them as unresolved if resolution failed. This replicates - // existing behavior when resolving during parsing. - if ident, _ := kv.Key.(*ast.Ident); ident != nil { - r.resolve(ident, false) - } else { - ast.Walk(r, kv.Key) - } - ast.Walk(r, kv.Value) - } else { - ast.Walk(r, e) - } - } - - case *ast.InterfaceType: - r.openScope(n.Pos()) - defer r.closeScope() - r.walkFieldList(n.Methods, ast.Fun) - - // Statements - case *ast.LabeledStmt: - r.declare(n, nil, r.labelScope, ast.Lbl, n.Label) - ast.Walk(r, n.Stmt) - - case *ast.AssignStmt: - r.walkExprs(n.Rhs) - if n.Tok == token.DEFINE { - r.shortVarDecl(n) - } else { - r.walkExprs(n.Lhs) - } - - case *ast.BranchStmt: - // add to list of unresolved targets - if n.Tok != token.FALLTHROUGH && n.Label != nil { - depth := len(r.targetStack) - 1 - r.targetStack[depth] = append(r.targetStack[depth], n.Label) - } - - case *ast.BlockStmt: - r.openScope(n.Pos()) - defer r.closeScope() - r.walkStmts(n.List) - - case *ast.IfStmt: - r.openScope(n.Pos()) - defer r.closeScope() - if n.Init != nil { - ast.Walk(r, n.Init) - } - ast.Walk(r, n.Cond) - ast.Walk(r, n.Body) - if n.Else != nil { - ast.Walk(r, n.Else) - } - - case *ast.CaseClause: - r.walkExprs(n.List) - r.openScope(n.Pos()) - defer r.closeScope() - r.walkStmts(n.Body) - - case *ast.SwitchStmt: - r.openScope(n.Pos()) - defer r.closeScope() - if n.Init != nil { - ast.Walk(r, n.Init) - } - if n.Tag != nil { - // The scope below reproduces some unnecessary behavior of the parser, - // opening an extra scope in case this is a type switch. It's not needed - // for expression switches. - // TODO: remove this once we've matched the parser resolution exactly. - if n.Init != nil { - r.openScope(n.Tag.Pos()) - defer r.closeScope() - } - ast.Walk(r, n.Tag) - } - if n.Body != nil { - r.walkStmts(n.Body.List) - } - - case *ast.TypeSwitchStmt: - if n.Init != nil { - r.openScope(n.Pos()) - defer r.closeScope() - ast.Walk(r, n.Init) - } - r.openScope(n.Assign.Pos()) - defer r.closeScope() - ast.Walk(r, n.Assign) - // s.Body consists only of case clauses, so does not get its own - // scope. - if n.Body != nil { - r.walkStmts(n.Body.List) - } - - case *ast.CommClause: - r.openScope(n.Pos()) - defer r.closeScope() - if n.Comm != nil { - ast.Walk(r, n.Comm) - } - r.walkStmts(n.Body) - - case *ast.SelectStmt: - // as for switch statements, select statement bodies don't get their own - // scope. - if n.Body != nil { - r.walkStmts(n.Body.List) - } - - case *ast.ForStmt: - r.openScope(n.Pos()) - defer r.closeScope() - if n.Init != nil { - ast.Walk(r, n.Init) - } - if n.Cond != nil { - ast.Walk(r, n.Cond) - } - if n.Post != nil { - ast.Walk(r, n.Post) - } - ast.Walk(r, n.Body) - - case *ast.RangeStmt: - r.openScope(n.Pos()) - defer r.closeScope() - ast.Walk(r, n.X) - var lhs []ast.Expr - if n.Key != nil { - lhs = append(lhs, n.Key) - } - if n.Value != nil { - lhs = append(lhs, n.Value) - } - if len(lhs) > 0 { - if n.Tok == token.DEFINE { - // Note: we can't exactly match the behavior of object resolution - // during the parsing pass here, as it uses the position of the RANGE - // token for the RHS OpPos. That information is not contained within - // the AST. - as := &ast.AssignStmt{ - Lhs: lhs, - Tok: token.DEFINE, - TokPos: n.TokPos, - Rhs: []ast.Expr{&ast.UnaryExpr{Op: token.RANGE, X: n.X}}, - } - // TODO(rFindley): this walkLHS reproduced the parser resolution, but - // is it necessary? By comparison, for a normal AssignStmt we don't - // walk the LHS in case there is an invalid identifier list. - r.walkLHS(lhs) - r.shortVarDecl(as) - } else { - r.walkExprs(lhs) - } - } - ast.Walk(r, n.Body) - - // Declarations - case *ast.GenDecl: - switch n.Tok { - case token.CONST, token.VAR: - for i, spec := range n.Specs { - spec := spec.(*ast.ValueSpec) - kind := ast.Con - if n.Tok == token.VAR { - kind = ast.Var - } - r.walkExprs(spec.Values) - if spec.Type != nil { - ast.Walk(r, spec.Type) - } - r.declare(spec, i, r.topScope, kind, spec.Names...) - } - case token.TYPE: - for _, spec := range n.Specs { - spec := spec.(*ast.TypeSpec) - // Go spec: The scope of a type identifier declared inside a function begins - // at the identifier in the TypeSpec and ends at the end of the innermost - // containing block. - r.declare(spec, nil, r.topScope, ast.Typ, spec.Name) - if spec.TypeParams != nil { - r.openScope(spec.Pos()) - defer r.closeScope() - r.walkTParams(spec.TypeParams) - } - ast.Walk(r, spec.Type) - } - } - - case *ast.FuncDecl: - // Open the function scope. - r.openScope(n.Pos()) - defer r.closeScope() - - r.walkRecv(n.Recv) - - // Type parameters are walked normally: they can reference each other, and - // can be referenced by normal parameters. - if n.Type.TypeParams != nil { - r.walkTParams(n.Type.TypeParams) - // TODO(rFindley): need to address receiver type parameters. - } - - // Resolve and declare parameters in a specific order to get duplicate - // declaration errors in the correct location. - r.resolveList(n.Type.Params) - r.resolveList(n.Type.Results) - r.declareList(n.Recv, ast.Var) - r.declareList(n.Type.Params, ast.Var) - r.declareList(n.Type.Results, ast.Var) - - r.walkBody(n.Body) - if n.Recv == nil && n.Name.Name != "init" { - r.declare(n, nil, r.pkgScope, ast.Fun, n.Name) - } - - default: - return r - } - - return nil -} - -func (r *resolver) walkFuncType(typ *ast.FuncType) { - // typ.TypeParams must be walked separately for FuncDecls. - r.resolveList(typ.Params) - r.resolveList(typ.Results) - r.declareList(typ.Params, ast.Var) - r.declareList(typ.Results, ast.Var) -} - -func (r *resolver) resolveList(list *ast.FieldList) { - if list == nil { - return - } - for _, f := range list.List { - if f.Type != nil { - ast.Walk(r, f.Type) - } - } -} - -func (r *resolver) declareList(list *ast.FieldList, kind ast.ObjKind) { - if list == nil { - return - } - for _, f := range list.List { - r.declare(f, nil, r.topScope, kind, f.Names...) - } -} - -func (r *resolver) walkRecv(recv *ast.FieldList) { - // If our receiver has receiver type parameters, we must declare them before - // trying to resolve the rest of the receiver, and avoid re-resolving the - // type parameter identifiers. - if recv == nil || len(recv.List) == 0 { - return // nothing to do - } - typ := recv.List[0].Type - if ptr, ok := typ.(*ast.StarExpr); ok { - typ = ptr.X - } - - var declareExprs []ast.Expr // exprs to declare - var resolveExprs []ast.Expr // exprs to resolve - switch typ := typ.(type) { - case *ast.IndexExpr: - declareExprs = []ast.Expr{typ.Index} - resolveExprs = append(resolveExprs, typ.X) - case *ast.IndexListExpr: - declareExprs = typ.Indices - resolveExprs = append(resolveExprs, typ.X) - default: - resolveExprs = append(resolveExprs, typ) - } - for _, expr := range declareExprs { - if id, _ := expr.(*ast.Ident); id != nil { - r.declare(expr, nil, r.topScope, ast.Typ, id) - } else { - // The receiver type parameter expression is invalid, but try to resolve - // it anyway for consistency. - resolveExprs = append(resolveExprs, expr) - } - } - for _, expr := range resolveExprs { - if expr != nil { - ast.Walk(r, expr) - } - } - // The receiver is invalid, but try to resolve it anyway for consistency. - for _, f := range recv.List[1:] { - if f.Type != nil { - ast.Walk(r, f.Type) - } - } -} - -func (r *resolver) walkFieldList(list *ast.FieldList, kind ast.ObjKind) { - if list == nil { - return - } - r.resolveList(list) - r.declareList(list, kind) -} - -// walkTParams is like walkFieldList, but declares type parameters eagerly so -// that they may be resolved in the constraint expressions held in the field -// Type. -func (r *resolver) walkTParams(list *ast.FieldList) { - r.declareList(list, ast.Typ) - r.resolveList(list) -} - -func (r *resolver) walkBody(body *ast.BlockStmt) { - if body == nil { - return - } - r.openLabelScope() - defer r.closeLabelScope() - r.walkStmts(body.List) -} diff --git a/internal/backport/go/parser/resolver_test.go b/internal/backport/go/parser/resolver_test.go deleted file mode 100644 index 8dd9172845..0000000000 --- a/internal/backport/go/parser/resolver_test.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package parser - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/internal/typeparams" - "golang.org/x/website/internal/backport/go/scanner" - "golang.org/x/website/internal/backport/go/token" - "os" - "path/filepath" - "strings" - "testing" -) - -// TestResolution checks that identifiers are resolved to the declarations -// annotated in the source, by comparing the positions of the resulting -// Ident.Obj.Decl to positions marked in the source via special comments. -// -// In the test source, any comment prefixed with '=' or '@' (or both) marks the -// previous token position as the declaration ('=') or a use ('@') of an -// identifier. The text following '=' and '@' in the comment string is the -// label to use for the location. Declaration labels must be unique within the -// file, and use labels must refer to an existing declaration label. It's OK -// for a comment to denote both the declaration and use of a label (e.g. -// '=@foo'). Leading and trailing whitespace is ignored. Any comment not -// beginning with '=' or '@' is ignored. -func TestResolution(t *testing.T) { - dir := filepath.Join("testdata", "resolution") - fis, err := os.ReadDir(dir) - if err != nil { - t.Fatal(err) - } - - for _, fi := range fis { - t.Run(fi.Name(), func(t *testing.T) { - fset := token.NewFileSet() - path := filepath.Join(dir, fi.Name()) - src := readFile(path) // panics on failure - var mode Mode - if !strings.HasSuffix(path, ".go2") { - mode |= typeparams.DisallowParsing - } - file, err := ParseFile(fset, path, src, mode) - if err != nil { - t.Fatal(err) - } - - // Compare the positions of objects resolved during parsing (fromParser) - // to those annotated in source comments (fromComments). - - handle := fset.File(file.Package) - fromParser := declsFromParser(file) - fromComments := declsFromComments(handle, src) - - pos := func(pos token.Pos) token.Position { - p := handle.Position(pos) - // The file name is implied by the subtest, so remove it to avoid - // clutter in error messages. - p.Filename = "" - return p - } - for k, want := range fromComments { - if got := fromParser[k]; got != want { - t.Errorf("%s resolved to %s, want %s", pos(k), pos(got), pos(want)) - } - delete(fromParser, k) - } - // What remains in fromParser are unexpected resolutions. - for k, got := range fromParser { - t.Errorf("%s resolved to %s, want no object", pos(k), pos(got)) - } - }) - } -} - -// declsFromParser walks the file and collects the map associating an -// identifier position with its declaration position. -func declsFromParser(file *ast.File) map[token.Pos]token.Pos { - objmap := map[token.Pos]token.Pos{} - ast.Inspect(file, func(node ast.Node) bool { - // Ignore blank identifiers to reduce noise. - if ident, _ := node.(*ast.Ident); ident != nil && ident.Obj != nil && ident.Name != "_" { - objmap[ident.Pos()] = ident.Obj.Pos() - } - return true - }) - return objmap -} - -// declsFromComments looks at comments annotating uses and declarations, and -// maps each identifier use to its corresponding declaration. See the -// description of these annotations in the documentation for TestResolution. -func declsFromComments(handle *token.File, src []byte) map[token.Pos]token.Pos { - decls, uses := positionMarkers(handle, src) - - objmap := make(map[token.Pos]token.Pos) - // Join decls and uses on name, to build the map of use->decl. - for name, posns := range uses { - declpos, ok := decls[name] - if !ok { - panic(fmt.Sprintf("missing declaration for %s", name)) - } - for _, pos := range posns { - objmap[pos] = declpos - } - } - return objmap -} - -// positionMarkers extracts named positions from the source denoted by comments -// prefixed with '=' (declarations) and '@' (uses): for example '@foo' or -// '=@bar'. It returns a map of name->position for declarations, and -// name->position(s) for uses. -func positionMarkers(handle *token.File, src []byte) (decls map[string]token.Pos, uses map[string][]token.Pos) { - var s scanner.Scanner - s.Init(handle, src, nil, scanner.ScanComments) - decls = make(map[string]token.Pos) - uses = make(map[string][]token.Pos) - var prev token.Pos // position of last non-comment, non-semicolon token - -scanFile: - for { - pos, tok, lit := s.Scan() - switch tok { - case token.EOF: - break scanFile - case token.COMMENT: - name, decl, use := annotatedObj(lit) - if len(name) > 0 { - if decl { - if _, ok := decls[name]; ok { - panic(fmt.Sprintf("duplicate declaration markers for %s", name)) - } - decls[name] = prev - } - if use { - uses[name] = append(uses[name], prev) - } - } - case token.SEMICOLON: - // ignore automatically inserted semicolon - if lit == "\n" { - continue scanFile - } - fallthrough - default: - prev = pos - } - } - return decls, uses -} - -func annotatedObj(lit string) (name string, decl, use bool) { - if lit[1] == '*' { - lit = lit[:len(lit)-2] // strip trailing */ - } - lit = strings.TrimSpace(lit[2:]) - -scanLit: - for idx, r := range lit { - switch r { - case '=': - decl = true - case '@': - use = true - default: - name = lit[idx:] - break scanLit - } - } - return -} diff --git a/internal/backport/go/parser/short_test.go b/internal/backport/go/parser/short_test.go deleted file mode 100644 index ada2caa26e..0000000000 --- a/internal/backport/go/parser/short_test.go +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains test cases for short valid and invalid programs. - -package parser - -import ( - "golang.org/x/website/internal/backport/go/internal/typeparams" - "testing" -) - -var valids = []string{ - "package p\n", - `package p;`, - `package p; import "fmt"; func f() { fmt.Println("Hello, World!") };`, - `package p; func f() { if f(T{}) {} };`, - `package p; func f() { _ = <-chan int(nil) };`, - `package p; func f() { _ = (<-chan int)(nil) };`, - `package p; func f() { _ = (<-chan <-chan int)(nil) };`, - `package p; func f() { _ = <-chan <-chan <-chan <-chan <-int(nil) };`, - `package p; func f(func() func() func());`, - `package p; func f(...T);`, - `package p; func f(float, ...int);`, - `package p; func f(x int, a ...int) { f(0, a...); f(1, a...,) };`, - `package p; func f(int,) {};`, - `package p; func f(...int,) {};`, - `package p; func f(x ...int,) {};`, - `package p; type T []int; var a []bool; func f() { if a[T{42}[0]] {} };`, - `package p; type T []int; func g(int) bool { return true }; func f() { if g(T{42}[0]) {} };`, - `package p; type T []int; func f() { for _ = range []int{T{42}[0]} {} };`, - `package p; var a = T{{1, 2}, {3, 4}}`, - `package p; func f() { select { case <- c: case c <- d: case c <- <- d: case <-c <- d: } };`, - `package p; func f() { select { case x := (<-c): } };`, - `package p; func f() { if ; true {} };`, - `package p; func f() { switch ; {} };`, - `package p; func f() { for _ = range "foo" + "bar" {} };`, - `package p; func f() { var s []int; g(s[:], s[i:], s[:j], s[i:j], s[i:j:k], s[:j:k]) };`, - `package p; var ( _ = (struct {*T}).m; _ = (interface {T}).m )`, - `package p; func ((T),) m() {}`, - `package p; func ((*T),) m() {}`, - `package p; func (*(T),) m() {}`, - `package p; func _(x []int) { for range x {} }`, - `package p; func _() { if [T{}.n]int{} {} }`, - `package p; func _() { map[int]int{}[0]++; map[int]int{}[0] += 1 }`, - `package p; func _(x interface{f()}) { interface{f()}(x).f() }`, - `package p; func _(x chan int) { chan int(x) <- 0 }`, - `package p; const (x = 0; y; z)`, // issue 9639 - `package p; var _ = map[P]int{P{}:0, {}:1}`, - `package p; var _ = map[*P]int{&P{}:0, {}:1}`, - `package p; type T = int`, - `package p; type (T = p.T; _ = struct{}; x = *T)`, - `package p; type T (*int)`, - `package p; type _ struct{ ((int)) }`, - `package p; type _ struct{ (*(int)) }`, - `package p; type _ struct{ ([]byte) }`, // disallowed by type-checker - `package p; var _ = func()T(nil)`, - `package p; func _(T (P))`, - `package p; func _(T []E)`, - `package p; func _(T [P]E)`, - `package p; type _ [A+B]struct{}`, - `package p; func (R) _()`, - `package p; type _ struct{ f [n]E }`, - `package p; type _ struct{ f [a+b+c+d]E }`, - `package p; type I1 interface{}; type I2 interface{ I1 }`, -} - -// validWithTParamsOnly holds source code examples that are valid if -// parseTypeParams is set, but invalid if not. When checking with the -// parseTypeParams set, errors are ignored. -var validWithTParamsOnly = []string{ - `package p; type _ []T[ /* ERROR "expected ';', found '\['" */ int]`, - `package p; type T[P any /* ERROR "expected ']', found any" */ ] struct { P }`, - `package p; type T[P comparable /* ERROR "expected ']', found comparable" */ ] struct { P }`, - `package p; type T[P comparable /* ERROR "expected ']', found comparable" */ [P]] struct { P }`, - `package p; type T[P1, /* ERROR "unexpected comma" */ P2 any] struct { P1; f []P2 }`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ T any]()()`, - `package p; func _(T (P))`, - `package p; func f[ /* ERROR "expected '\(', found '\['" */ A, B any](); func _() { _ = f[int, int] }`, - `package p; func _(x /* ERROR "mixed named and unnamed parameters" */ T[P1, P2, P3])`, - `package p; func _(x /* ERROR "mixed named and unnamed parameters" */ p.T[Q])`, - `package p; func _(p.T[ /* ERROR "missing ',' in parameter list" */ Q])`, - `package p; type _[A interface /* ERROR "expected ']', found 'interface'" */ {},] struct{}`, - `package p; type _[A interface /* ERROR "expected ']', found 'interface'" */ {}] struct{}`, - `package p; type _[A, /* ERROR "unexpected comma" */ B any,] struct{}`, - `package p; type _[A, /* ERROR "unexpected comma" */ B any] struct{}`, - `package p; type _[A any /* ERROR "expected ']', found any" */,] struct{}`, - `package p; type _[A any /* ERROR "expected ']', found any" */ ]struct{}`, - `package p; type _[A any /* ERROR "expected ']', found any" */ ] struct{ A }`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ T any]()`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ T any](x T)`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ T1, T2 any](x T)`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ A, B any](a A) B`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ A, B C](a A) B`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ A, B C[A, B]](a A) B`, - - `package p; type _[A, /* ERROR "unexpected comma" */ B any] interface { _(a A) B }`, - `package p; type _[A, /* ERROR "unexpected comma" */ B C[A, B]] interface { _(a A) B }`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ T1, T2 interface{}](x T1) T2`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ T1 interface{ m() }, T2, T3 interface{}](x T1, y T3) T2`, - `package p; var _ = [ /* ERROR "expected expression" */ ]T[int]{}`, - `package p; var _ = [ /* ERROR "expected expression" */ 10]T[int]{}`, - `package p; var _ = func /* ERROR "expected expression" */ ()T[int]{}`, - `package p; var _ = map /* ERROR "expected expression" */ [T[int]]T[int]{}`, - `package p; var _ = chan /* ERROR "expected expression" */ T[int](x)`, - `package p; func _(_ T[ /* ERROR "missing ',' in parameter list" */ P], T P) T[P]`, - `package p; var _ T[ /* ERROR "expected ';', found '\['" */ chan int]`, - - // TODO(rfindley) this error message could be improved. - `package p; func (_ /* ERROR "mixed named and unnamed parameters" */ R[P]) _(x T)`, - `package p; func (_ /* ERROR "mixed named and unnamed parameters" */ R[ P, Q]) _(x T)`, - - `package p; func (R[P] /* ERROR "missing element type" */ ) _()`, - `package p; func _(T[P] /* ERROR "missing element type" */ )`, - `package p; func _(T[P1, /* ERROR "expected ']', found ','" */ P2, P3 ])`, - `package p; func _(T[P] /* ERROR "missing element type" */ ) T[P]`, - `package p; type _ struct{ T[P] /* ERROR "missing element type" */ }`, - `package p; type _ struct{ T[struct /* ERROR "expected expression" */ {a, b, c int}] }`, - `package p; type _ interface{int| /* ERROR "expected ';'" */ float32; bool; m(); string;}`, - `package p; type I1[T any /* ERROR "expected ']', found any" */ ] interface{}; type I2 interface{ I1[int] }`, - `package p; type I1[T any /* ERROR "expected ']', found any" */ ] interface{}; type I2[T any] interface{ I1[T] }`, - `package p; type _ interface { N[ /* ERROR "expected ';', found '\['" */ T] }`, - `package p; type T[P any /* ERROR "expected ']'" */ ] = T0`, -} - -func TestValid(t *testing.T) { - t.Run("no tparams", func(t *testing.T) { - for _, src := range valids { - checkErrors(t, src, src, DeclarationErrors|AllErrors, false) - } - }) - t.Run("tparams", func(t *testing.T) { - for _, src := range valids { - checkErrors(t, src, src, DeclarationErrors|AllErrors, false) - } - for _, src := range validWithTParamsOnly { - checkErrors(t, src, src, DeclarationErrors|AllErrors, false) - } - }) -} - -// TestSingle is useful to track down a problem with a single short test program. -func TestSingle(t *testing.T) { - const src = `package p; var _ = T{}` - checkErrors(t, src, src, DeclarationErrors|AllErrors, true) -} - -var invalids = []string{ - `foo /* ERROR "expected 'package'" */ !`, - `package p; func f() { if { /* ERROR "missing condition" */ } };`, - `package p; func f() { if ; /* ERROR "missing condition" */ {} };`, - `package p; func f() { if f(); /* ERROR "missing condition" */ {} };`, - `package p; func f() { if _ = range /* ERROR "expected operand" */ x; true {} };`, - `package p; func f() { switch _ /* ERROR "expected switch expression" */ = range x; true {} };`, - `package p; func f() { for _ = range x ; /* ERROR "expected '{'" */ ; {} };`, - `package p; func f() { for ; ; _ = range /* ERROR "expected operand" */ x {} };`, - `package p; func f() { for ; _ /* ERROR "expected boolean or range expression" */ = range x ; {} };`, - `package p; func f() { switch t = /* ERROR "expected ':=', found '='" */ t.(type) {} };`, - `package p; func f() { switch t /* ERROR "expected switch expression" */ , t = t.(type) {} };`, - `package p; func f() { switch t /* ERROR "expected switch expression" */ = t.(type), t {} };`, - `package p; var a = [ /* ERROR "expected expression" */ 1]int;`, - `package p; var a = [ /* ERROR "expected expression" */ ...]int;`, - `package p; var a = struct /* ERROR "expected expression" */ {}`, - `package p; var a = func /* ERROR "expected expression" */ ();`, - `package p; var a = interface /* ERROR "expected expression" */ {}`, - `package p; var a = [ /* ERROR "expected expression" */ ]int`, - `package p; var a = map /* ERROR "expected expression" */ [int]int`, - `package p; var a = chan /* ERROR "expected expression" */ int;`, - `package p; var a = []int{[ /* ERROR "expected expression" */ ]int};`, - `package p; var a = ( /* ERROR "expected expression" */ []int);`, - `package p; var a = <- /* ERROR "expected expression" */ chan int;`, - `package p; func f() { select { case _ <- chan /* ERROR "expected expression" */ int: } };`, - `package p; func f() { _ = (<-<- /* ERROR "expected 'chan'" */ chan int)(nil) };`, - `package p; func f() { _ = (<-chan<-chan<-chan<-chan<-chan<- /* ERROR "expected channel type" */ int)(nil) };`, - `package p; func f() { var t []int; t /* ERROR "expected identifier on left side of :=" */ [0] := 0 };`, - `package p; func f() { if x := g(); x /* ERROR "expected boolean expression" */ = 0 {}};`, - `package p; func f() { _ = x = /* ERROR "expected '=='" */ 0 {}};`, - `package p; func f() { _ = 1 == func()int { var x bool; x = x = /* ERROR "expected '=='" */ true; return x }() };`, - `package p; func f() { var s []int; _ = s[] /* ERROR "expected operand" */ };`, - `package p; func f() { var s []int; _ = s[i:j: /* ERROR "3rd index required" */ ] };`, - `package p; func f() { var s []int; _ = s[i: /* ERROR "2nd index required" */ :k] };`, - `package p; func f() { var s []int; _ = s[i: /* ERROR "2nd index required" */ :] };`, - `package p; func f() { var s []int; _ = s[: /* ERROR "2nd index required" */ :] };`, - `package p; func f() { var s []int; _ = s[: /* ERROR "2nd index required" */ ::] };`, - `package p; func f() { var s []int; _ = s[i:j:k: /* ERROR "expected ']'" */ l] };`, - `package p; func f() { for x /* ERROR "boolean or range expression" */ = []string {} }`, - `package p; func f() { for x /* ERROR "boolean or range expression" */ := []string {} }`, - `package p; func f() { for i /* ERROR "boolean or range expression" */ , x = []string {} }`, - `package p; func f() { for i /* ERROR "boolean or range expression" */ , x := []string {} }`, - `package p; func f() { go f /* ERROR HERE "function must be invoked" */ }`, - `package p; func f() { defer func() {} /* ERROR HERE "function must be invoked" */ }`, - `package p; func f() { go func() { func() { f(x func /* ERROR "missing ','" */ (){}) } } }`, - `package p; func _() (type /* ERROR "found 'type'" */ T)(T)`, - `package p; func (type /* ERROR "found 'type'" */ T)(T) _()`, - `package p; type _[A+B, /* ERROR "unexpected comma" */ ] int`, - - // TODO(rfindley): this error should be positioned on the ':' - `package p; var a = a[[]int:[ /* ERROR "expected expression" */ ]int];`, - - // TODO(rfindley): the compiler error is better here: "cannot parenthesize embedded type" - // TODO(rfindley): confirm that parenthesized types should now be accepted. - // `package p; type I1 interface{}; type I2 interface{ (/* ERROR "expected '}', found '\('" */ I1) }`, - - // issue 8656 - `package p; func f() (a b string /* ERROR "missing ','" */ , ok bool)`, - - // issue 9639 - `package p; var x /* ERROR "missing variable type or initialization" */ , y, z;`, - `package p; const x /* ERROR "missing constant value" */ ;`, - `package p; const x /* ERROR "missing constant value" */ int;`, - `package p; const (x = 0; y; z /* ERROR "missing constant value" */ int);`, - - // issue 12437 - `package p; var _ = struct { x int, /* ERROR "expected ';', found ','" */ }{};`, - `package p; var _ = struct { x int, /* ERROR "expected ';', found ','" */ y float }{};`, - - // issue 11611 - `package p; type _ struct { int, } /* ERROR "expected 'IDENT', found '}'" */ ;`, - `package p; type _ struct { int, float } /* ERROR "expected type, found '}'" */ ;`, - - // issue 13475 - `package p; func f() { if true {} else ; /* ERROR "expected if statement or block" */ }`, - `package p; func f() { if true {} else defer /* ERROR "expected if statement or block" */ f() }`, -} - -// invalidNoTParamErrs holds invalid source code examples annotated with the -// error messages produced when ParseTypeParams is not set. -var invalidNoTParamErrs = []string{ - `package p; type _[_ any /* ERROR "expected ']', found any" */ ] int; var _ = T[]{}`, - `package p; type T[P any /* ERROR "expected ']', found any" */ ] = T0`, - `package p; var _ func[ /* ERROR "expected '\(', found '\['" */ T any](T)`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ ]()`, - `package p; type _[A, /* ERROR "unexpected comma" */] struct{ A }`, - `package p; func _[ /* ERROR "expected '\(', found '\['" */ type P, *Q interface{}]()`, - - `package p; func (T) _[ /* ERROR "expected '\(', found '\['" */ A, B any](a A) B`, - `package p; func (T) _[ /* ERROR "expected '\(', found '\['" */ A, B C](a A) B`, - `package p; func (T) _[ /* ERROR "expected '\(', found '\['" */ A, B C[A, B]](a A) B`, - - `package p; func(*T[ /* ERROR "missing ',' in parameter list" */ e, e]) _()`, -} - -// invalidTParamErrs holds invalid source code examples annotated with the -// error messages produced when ParseTypeParams is set. -var invalidTParamErrs = []string{ - `package p; type _[_ any] int; var _ = T[] /* ERROR "expected operand" */ {}`, - `package p; var _ func[ /* ERROR "must have no type parameters" */ T any](T)`, - `package p; func _[]/* ERROR "empty type parameter list" */()`, - - // TODO(rfindley) a better location would be after the ']' - `package p; type _[A /* ERROR "all type parameters must be named" */ ,] struct{ A }`, - - // TODO(rfindley) this error is confusing. - `package p; func _[type /* ERROR "all type parameters must be named" */ P, *Q interface{}]()`, - - `package p; func (T) _[ /* ERROR "must have no type parameters" */ A, B any](a A) B`, - `package p; func (T) _[ /* ERROR "must have no type parameters" */ A, B C](a A) B`, - `package p; func (T) _[ /* ERROR "must have no type parameters" */ A, B C[A, B]](a A) B`, - - `package p; func(*T[e, e /* ERROR "e redeclared" */ ]) _()`, -} - -func TestInvalid(t *testing.T) { - t.Run("no tparams", func(t *testing.T) { - for _, src := range invalids { - checkErrors(t, src, src, DeclarationErrors|AllErrors|typeparams.DisallowParsing, true) - } - for _, src := range validWithTParamsOnly { - checkErrors(t, src, src, DeclarationErrors|AllErrors|typeparams.DisallowParsing, true) - } - for _, src := range invalidNoTParamErrs { - checkErrors(t, src, src, DeclarationErrors|AllErrors|typeparams.DisallowParsing, true) - } - }) - t.Run("tparams", func(t *testing.T) { - for _, src := range invalids { - checkErrors(t, src, src, DeclarationErrors|AllErrors, true) - } - for _, src := range invalidTParamErrs { - checkErrors(t, src, src, DeclarationErrors|AllErrors, true) - } - }) -} diff --git a/internal/backport/go/parser/testdata/chans.go2 b/internal/backport/go/parser/testdata/chans.go2 deleted file mode 100644 index fad2bcec9d..0000000000 --- a/internal/backport/go/parser/testdata/chans.go2 +++ /dev/null @@ -1,62 +0,0 @@ -package chans - -import "runtime" - -// Ranger returns a Sender and a Receiver. The Receiver provides a -// Next method to retrieve values. The Sender provides a Send method -// to send values and a Close method to stop sending values. The Next -// method indicates when the Sender has been closed, and the Send -// method indicates when the Receiver has been freed. -// -// This is a convenient way to exit a goroutine sending values when -// the receiver stops reading them. -func Ranger[T any]() (*Sender[T], *Receiver[T]) { - c := make(chan T) - d := make(chan bool) - s := &Sender[T]{values: c, done: d} - r := &Receiver[T]{values: c, done: d} - runtime.SetFinalizer(r, r.finalize) - return s, r -} - -// A sender is used to send values to a Receiver. -type Sender[T any] struct { - values chan<- T - done <-chan bool -} - -// Send sends a value to the receiver. It returns whether any more -// values may be sent; if it returns false the value was not sent. -func (s *Sender[T]) Send(v T) bool { - select { - case s.values <- v: - return true - case <-s.done: - return false - } -} - -// Close tells the receiver that no more values will arrive. -// After Close is called, the Sender may no longer be used. -func (s *Sender[T]) Close() { - close(s.values) -} - -// A Receiver receives values from a Sender. -type Receiver[T any] struct { - values <-chan T - done chan<- bool -} - -// Next returns the next value from the channel. The bool result -// indicates whether the value is valid, or whether the Sender has -// been closed and no more values will be received. -func (r *Receiver[T]) Next() (T, bool) { - v, ok := <-r.values - return v, ok -} - -// finalize is a finalizer for the receiver. -func (r *Receiver[T]) finalize() { - close(r.done) -} diff --git a/internal/backport/go/parser/testdata/commas.src b/internal/backport/go/parser/testdata/commas.src deleted file mode 100644 index e0603cf9f7..0000000000 --- a/internal/backport/go/parser/testdata/commas.src +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test case for error messages/parser synchronization -// after missing commas. - -package p - -var _ = []int{ - 0/* ERROR HERE "missing ','" */ -} - -var _ = []int{ - 0, - 1, - 2, - 3/* ERROR HERE "missing ','" */ -} diff --git a/internal/backport/go/parser/testdata/interface.go2 b/internal/backport/go/parser/testdata/interface.go2 deleted file mode 100644 index 2ed9339c52..0000000000 --- a/internal/backport/go/parser/testdata/interface.go2 +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains test cases for interfaces containing -// constraint elements. - -package p - -type _ interface { - m() - ~int - ~int|string - E -} - -type _ interface { - m() - ~int - int | string - int | ~string - ~int | ~string -} - -type _ interface { - m() - ~int - T[int, string] | string - int | ~T[string, struct{}] - ~int | ~string -} - -type _ interface { - int - []byte - [10]int - struct{} - *int - func() - interface{} - map[string]int - chan T - chan<- T - <-chan T - T[int] -} - -type _ interface { - int | string - []byte | string - [10]int | string - struct{} | string - *int | string - func() | string - interface{} | string - map[string]int | string - chan T | string - chan<- T | string - <-chan T | string - T[int] | string -} - -type _ interface { - ~int | string - ~[]byte | string - ~[10]int | string - ~struct{} | string - ~*int | string - ~func() | string - ~interface{} | string - ~map[string]int | string - ~chan T | string - ~chan<- T | string - ~<-chan T | string - ~T[int] | string -} diff --git a/internal/backport/go/parser/testdata/issue11377.src b/internal/backport/go/parser/testdata/issue11377.src deleted file mode 100644 index 1c438003eb..0000000000 --- a/internal/backport/go/parser/testdata/issue11377.src +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test case for issue 11377: Better synchronization of -// parser after certain syntax errors. - -package p - -func bad1() { - if f()) /* ERROR "expected ';', found '\)'" */ { - return - } -} - -// There shouldn't be any errors down below. - -func F1() {} -func F2() {} -func F3() {} -func F4() {} -func F5() {} -func F6() {} -func F7() {} -func F8() {} -func F9() {} -func F10() {} diff --git a/internal/backport/go/parser/testdata/issue23434.src b/internal/backport/go/parser/testdata/issue23434.src deleted file mode 100644 index 24a0832347..0000000000 --- a/internal/backport/go/parser/testdata/issue23434.src +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test case for issue 23434: Better synchronization of -// parser after missing type. There should be exactly -// one error each time, with now follow errors. - -package p - -func g() { - m := make(map[string]! /* ERROR "expected type, found '!'" */ ) - for { - x := 1 - print(x) - } -} - -func f() { - m := make(map[string]) /* ERROR "expected type, found '\)'" */ - for { - x := 1 - print(x) - } -} diff --git a/internal/backport/go/parser/testdata/issue3106.src b/internal/backport/go/parser/testdata/issue3106.src deleted file mode 100644 index 2db10be235..0000000000 --- a/internal/backport/go/parser/testdata/issue3106.src +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test case for issue 3106: Better synchronization of -// parser after certain syntax errors. - -package main - -func f() { - var m Mutex - c := MakeCond(&m) - percent := 0 - const step = 10 - for i := 0; i < 5; i++ { - go func() { - for { - // Emulates some useful work. - time.Sleep(1e8) - m.Lock() - defer - if /* ERROR "expected ';', found 'if'" */ percent == 100 { - m.Unlock() - break - } - percent++ - if percent % step == 0 { - //c.Signal() - } - m.Unlock() - } - }() - } - for { - m.Lock() - if percent == 0 || percent % step != 0 { - c.Wait() - } - fmt.Print(",") - if percent == 100 { - m.Unlock() - break - } - m.Unlock() - } -} diff --git a/internal/backport/go/parser/testdata/issue34946.src b/internal/backport/go/parser/testdata/issue34946.src deleted file mode 100644 index 6bb15e10c7..0000000000 --- a/internal/backport/go/parser/testdata/issue34946.src +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test case for issue 34946: Better synchronization of -// parser for function declarations that start their -// body's opening { on a new line. - -package p - -// accept Allman/BSD-style declaration but complain -// (implicit semicolon between signature and body) -func _() int -{ /* ERROR "unexpected semicolon or newline before {" */ - { return 0 } -} - -func _() {} - -func _(); { /* ERROR "unexpected semicolon or newline before {" */ } - -func _() {} diff --git a/internal/backport/go/parser/testdata/issue42951/not_a_file.go/invalid.go b/internal/backport/go/parser/testdata/issue42951/not_a_file.go/invalid.go deleted file mode 100644 index bb698be11c..0000000000 --- a/internal/backport/go/parser/testdata/issue42951/not_a_file.go/invalid.go +++ /dev/null @@ -1 +0,0 @@ -This file should not be parsed by ParseDir. diff --git a/internal/backport/go/parser/testdata/issue44504.src b/internal/backport/go/parser/testdata/issue44504.src deleted file mode 100644 index 7791f4a809..0000000000 --- a/internal/backport/go/parser/testdata/issue44504.src +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test case for issue 44504: panic due to duplicate resolution of slice/index -// operands. We should not try to resolve a LHS expression with invalid syntax. - -package p - -func _() { - var items []bool - items[] /* ERROR "operand" */ = false -} diff --git a/internal/backport/go/parser/testdata/issue49174.go2 b/internal/backport/go/parser/testdata/issue49174.go2 deleted file mode 100644 index 77c195083f..0000000000 --- a/internal/backport/go/parser/testdata/issue49174.go2 +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p - -func _[_ []int | int]() {} -func _[_ int | []int]() {} diff --git a/internal/backport/go/parser/testdata/issue49175.go2 b/internal/backport/go/parser/testdata/issue49175.go2 deleted file mode 100644 index a5ad30f14c..0000000000 --- a/internal/backport/go/parser/testdata/issue49175.go2 +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p - -type _[_ []t]t -type _[_ [1]t]t - -func _[_ []t]() {} -func _[_ [1]t]() {} - -type t [t /* ERROR "all type parameters must be named" */ [0]]t diff --git a/internal/backport/go/parser/testdata/issue49482.go2 b/internal/backport/go/parser/testdata/issue49482.go2 deleted file mode 100644 index d8385bed4f..0000000000 --- a/internal/backport/go/parser/testdata/issue49482.go2 +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p - -type ( - // these need a comma to disambiguate - _[P *T,] struct{} - _[P *T, _ any] struct{} - _[P (*T),] struct{} - _[P (*T), _ any] struct{} - _[P (T),] struct{} - _[P (T), _ any] struct{} - - // these parse as name followed by type - _[P *struct{}] struct{} - _[P (*struct{})] struct{} - _[P ([]int)] struct{} - - // array declarations - _ [P(T)]struct{} - _ [P((T))]struct{} - _ [P * *T]struct{} - _ [P * T]struct{} - _ [P(*T)]struct{} - _ [P(**T)]struct{} - _ [P * T - T]struct{} - _ [P*T-T, /* ERROR "unexpected comma" */ ]struct{} - _ [10, /* ERROR "unexpected comma" */ ]struct{} - - _[P *struct{}|int] struct{} - _[P *struct{}|int|string] struct{} -) diff --git a/internal/backport/go/parser/testdata/issue50427.go2 b/internal/backport/go/parser/testdata/issue50427.go2 deleted file mode 100644 index 15214594e2..0000000000 --- a/internal/backport/go/parser/testdata/issue50427.go2 +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p - -type T interface{ m[ /* ERROR "must have no type parameters" */ P any]() } - -func _(t T) { - var _ interface{ m[ /* ERROR "must have no type parameters" */ P any](); n() } = t -} - -type S struct{} - -func (S) m[ /* ERROR "must have no type parameters" */ P any]() {} - -func _(s S) { - var _ interface{ m[ /* ERROR "must have no type parameters" */ P any](); n() } = s -} diff --git a/internal/backport/go/parser/testdata/linalg.go2 b/internal/backport/go/parser/testdata/linalg.go2 deleted file mode 100644 index 7ccb19c08d..0000000000 --- a/internal/backport/go/parser/testdata/linalg.go2 +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package linalg - -import "math" - -// Numeric is type bound that matches any numeric type. -// It would likely be in a constraints package in the standard library. -type Numeric interface { - ~int|~int8|~int16|~int32|~int64| - ~uint|~uint8|~uint16|~uint32|~uint64|~uintptr| - ~float32|~float64| - ~complex64|~complex128 -} - -func DotProduct[T Numeric](s1, s2 []T) T { - if len(s1) != len(s2) { - panic("DotProduct: slices of unequal length") - } - var r T - for i := range s1 { - r += s1[i] * s2[i] - } - return r -} - -// NumericAbs matches numeric types with an Abs method. -type NumericAbs[T any] interface { - Numeric - - Abs() T -} - -// AbsDifference computes the absolute value of the difference of -// a and b, where the absolute value is determined by the Abs method. -func AbsDifference[T NumericAbs](a, b T) T { - d := a - b - return d.Abs() -} - -// OrderedNumeric is a type bound that matches numeric types that support the < operator. -type OrderedNumeric interface { - ~int|~int8|~int16|~int32|~int64| - ~uint|~uint8|~uint16|~uint32|~uint64|~uintptr| - ~float32|~float64 -} - -// Complex is a type bound that matches the two complex types, which do not have a < operator. -type Complex interface { - ~complex64|~complex128 -} - -// OrderedAbs is a helper type that defines an Abs method for -// ordered numeric types. -type OrderedAbs[T OrderedNumeric] T - -func (a OrderedAbs[T]) Abs() OrderedAbs[T] { - if a < 0 { - return -a - } - return a -} - -// ComplexAbs is a helper type that defines an Abs method for -// complex types. -type ComplexAbs[T Complex] T - -func (a ComplexAbs[T]) Abs() ComplexAbs[T] { - r := float64(real(a)) - i := float64(imag(a)) - d := math.Sqrt(r * r + i * i) - return ComplexAbs[T](complex(d, 0)) -} - -func OrderedAbsDifference[T OrderedNumeric](a, b T) T { - return T(AbsDifference(OrderedAbs[T](a), OrderedAbs[T](b))) -} - -func ComplexAbsDifference[T Complex](a, b T) T { - return T(AbsDifference(ComplexAbs[T](a), ComplexAbs[T](b))) -} diff --git a/internal/backport/go/parser/testdata/map.go2 b/internal/backport/go/parser/testdata/map.go2 deleted file mode 100644 index 74c79ae44f..0000000000 --- a/internal/backport/go/parser/testdata/map.go2 +++ /dev/null @@ -1,109 +0,0 @@ -// Package orderedmap provides an ordered map, implemented as a binary tree. -package orderedmap - -import "chans" - -// Map is an ordered map. -type Map[K, V any] struct { - root *node[K, V] - compare func(K, K) int -} - -// node is the type of a node in the binary tree. -type node[K, V any] struct { - key K - val V - left, right *node[K, V] -} - -// New returns a new map. -func New[K, V any](compare func(K, K) int) *Map[K, V] { - return &Map[K, V]{compare: compare} -} - -// find looks up key in the map, and returns either a pointer -// to the node holding key, or a pointer to the location where -// such a node would go. -func (m *Map[K, V]) find(key K) **node[K, V] { - pn := &m.root - for *pn != nil { - switch cmp := m.compare(key, (*pn).key); { - case cmp < 0: - pn = &(*pn).left - case cmp > 0: - pn = &(*pn).right - default: - return pn - } - } - return pn -} - -// Insert inserts a new key/value into the map. -// If the key is already present, the value is replaced. -// Returns true if this is a new key, false if already present. -func (m *Map[K, V]) Insert(key K, val V) bool { - pn := m.find(key) - if *pn != nil { - (*pn).val = val - return false - } - *pn = &node[K, V]{key: key, val: val} - return true -} - -// Find returns the value associated with a key, or zero if not present. -// The found result reports whether the key was found. -func (m *Map[K, V]) Find(key K) (V, bool) { - pn := m.find(key) - if *pn == nil { - var zero V // see the discussion of zero values, above - return zero, false - } - return (*pn).val, true -} - -// keyValue is a pair of key and value used when iterating. -type keyValue[K, V any] struct { - key K - val V -} - -// InOrder returns an iterator that does an in-order traversal of the map. -func (m *Map[K, V]) InOrder() *Iterator[K, V] { - sender, receiver := chans.Ranger[keyValue[K, V]]() - var f func(*node[K, V]) bool - f = func(n *node[K, V]) bool { - if n == nil { - return true - } - // Stop sending values if sender.Send returns false, - // meaning that nothing is listening at the receiver end. - return f(n.left) && - // TODO - // sender.Send(keyValue[K, V]{n.key, n.val}) && - f(n.right) - } - go func() { - f(m.root) - sender.Close() - }() - return &Iterator{receiver} -} - -// Iterator is used to iterate over the map. -type Iterator[K, V any] struct { - r *chans.Receiver[keyValue[K, V]] -} - -// Next returns the next key and value pair, and a boolean indicating -// whether they are valid or whether we have reached the end. -func (it *Iterator[K, V]) Next() (K, V, bool) { - keyval, ok := it.r.Next() - if !ok { - var zerok K - var zerov V - return zerok, zerov, false - } - return keyval.key, keyval.val, true -} diff --git a/internal/backport/go/parser/testdata/metrics.go2 b/internal/backport/go/parser/testdata/metrics.go2 deleted file mode 100644 index ef1c66b241..0000000000 --- a/internal/backport/go/parser/testdata/metrics.go2 +++ /dev/null @@ -1,58 +0,0 @@ -package metrics - -import "sync" - -type Metric1[T comparable] struct { - mu sync.Mutex - m map[T]int -} - -func (m *Metric1[T]) Add(v T) { - m.mu.Lock() - defer m.mu.Unlock() - if m.m == nil { - m.m = make(map[T]int) - } - m[v]++ -} - -type key2[T1, T2 comparable] struct { - f1 T1 - f2 T2 -} - -type Metric2[T1, T2 cmp2] struct { - mu sync.Mutex - m map[key2[T1, T2]]int -} - -func (m *Metric2[T1, T2]) Add(v1 T1, v2 T2) { - m.mu.Lock() - defer m.mu.Unlock() - if m.m == nil { - m.m = make(map[key2[T1, T2]]int) - } - m[key[T1, T2]{v1, v2}]++ -} - -type key3[T1, T2, T3 comparable] struct { - f1 T1 - f2 T2 - f3 T3 -} - -type Metric3[T1, T2, T3 comparable] struct { - mu sync.Mutex - m map[key3[T1, T2, T3]]int -} - -func (m *Metric3[T1, T2, T3]) Add(v1 T1, v2 T2, v3 T3) { - m.mu.Lock() - defer m.mu.Unlock() - if m.m == nil { - m.m = make(map[key3]int) - } - m[key[T1, T2, T3]{v1, v2, v3}]++ -} - -// Repeat for the maximum number of permitted arguments. diff --git a/internal/backport/go/parser/testdata/resolution/issue45136.src b/internal/backport/go/parser/testdata/resolution/issue45136.src deleted file mode 100644 index e1d63d8377..0000000000 --- a/internal/backport/go/parser/testdata/resolution/issue45136.src +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package issue45136 - -type obj /* =@obj */ struct { - name /*=@name */ string -} - -func _() { - var foo /* =@foo */ = "foo" - obj /* @obj */ ["foo"] - obj /* @obj */ .run() - obj /* @obj */ { - name: foo /* @foo */, - } - obj /* @obj */ { - name: "bar", - }.run() - - var _ = File{key: obj /* @obj */ {}} - var _ = File{obj /* @obj */ {}} - - []obj /* @obj */ {foo /* @foo */} - x /* =@x1 */ := obj /* @obj */{} -} diff --git a/internal/backport/go/parser/testdata/resolution/issue45160.src b/internal/backport/go/parser/testdata/resolution/issue45160.src deleted file mode 100644 index 6be933b783..0000000000 --- a/internal/backport/go/parser/testdata/resolution/issue45160.src +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package issue45160 - -func mklink1 /* =@mklink1func */() {} - -func _() { - var tests /* =@tests */ = []dirLinkTest /* @dirLinkTest */ { - { - mklink1 /* @mklink1func */: func() {}, - mklink2: func(link /* =@link */, target /* =@target */ string) error { - return nil - }, - }, - } -} - -type dirLinkTest /* =@dirLinkTest */ struct { - mklink1 /* =@mklink1field */ func(string, string) error - mklink2 /* =@mklink2field */ func(string, string) error -} - -func mklink2 /* =@mklink2func */() {} diff --git a/internal/backport/go/parser/testdata/resolution/resolution.src b/internal/backport/go/parser/testdata/resolution/resolution.src deleted file mode 100644 index a880dd1c5e..0000000000 --- a/internal/backport/go/parser/testdata/resolution/resolution.src +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package resolution - -func f /* =@fdecl */(n /* =@narg */ ast.Node) bool { - if n /* =@ninit */, ok /* =@ok */ := n /* @narg */ .(*ast.SelectorExpr); ok /* @ok */ { - sel = n /* @ninit */ - } -} - -type c /* =@cdecl */ map[token.Pos]resolvedObj - -func (v /* =@vdecl */ c /* @cdecl */) Visit(node /* =@nodearg */ ast.Node) (w /* =@w */ ast.Visitor) {} - -const ( - basic /* =@basic */ = iota - labelOk // =@labelOk -) - -type T /* =@T */ int - -func _(count /* =@count */ T /* @T */) { - x /* =@x1 */ := c /* @cdecl */{} - switch x /* =@x2 */ := x /* @x1 */; x /* =@x3 */ := x /* @x2 */.(type) { - case c /* @cdecl */: - default: - } -loop /* =@loop */: - for { - if true { - break loop /* @loop */ - } - } - select { - case err /* =@err1 */ := <-_: - return err /* @err1 */ - case err /* =@err2 */ := <-_: - return err /* @err2 */ - } - - _ = func(p1 /* =@p1 */ int, p2 /* =@p2 */ p1) { - closed /* =@closed */ := p1 // @p1 - shadowed /* =@shadowed1 */ := p2 // @p2 - _ = func(shadowed /* =@shadowed2 */ p2 /* @p2 */) { - closed /* @closed */ = 1 - shadowed /* @shadowed2 */ = 2 - } - } -} - -func (r /* =@r */ c /* @cdecl */) m(_ r) c /* @cdecl */ { return r /* @r */ } - -var cycle /* =@cycle */ = cycle /* @cycle */ + 1 - -type chain /* =@chain */ struct { - next /* =@next */ *chain /* @chain */ -} - -func recursive /* =@recursive */() { - recursive /* @recursive */ () -} diff --git a/internal/backport/go/parser/testdata/resolution/typeparams.go2 b/internal/backport/go/parser/testdata/resolution/typeparams.go2 deleted file mode 100644 index 7395ca2a34..0000000000 --- a/internal/backport/go/parser/testdata/resolution/typeparams.go2 +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package resolution - -type List /* =@List */ [E /* =@E */ any] []E // @E - -type Pair /* =@Pair */ [L /* =@L */, R /* =@R */ any] struct { - Left /* =@Left */ L // @L - Right /* =@Right */ R // @R - L /* =@Lfield */ int -} - -var _ = Pair /* @Pair */ [int, string]{} - -type Addable /* =@Addable */ interface { - ~int64|~float64 -} - -func Add /* =@AddDecl */[T /* =@T */ Addable /* @Addable */](l /* =@l */, r /* =@r */ T /* @T */) T /* @T */ { - var t /* =@t */ T /* @T */ - return l /* @l */ + r /* @r */ + t /* @t */ -} - -type Receiver /* =@Receiver */[P /* =@P */ any] struct {} - -type RP /* =@RP1 */ struct{} - -// TODO(rFindley): make a decision on how/whether to resolve identifiers that -// refer to receiver type parameters, as is the case for the 'P' result -// parameter below. -// -// For now, we ensure that types are not incorrectly resolved when receiver -// type parameters are in scope. -func (r /* =@recv */ Receiver /* @Receiver */ [RP]) m(RP) RP {} - -func f /* =@f */[T1 /* =@T1 */ interface{~[]T2 /* @T2 */}, T2 /* =@T2 */ any]( - x /* =@x */ T1 /* @T1 */, T1 /* =@T1_duplicate */ y, // Note that this is a bug: - // the duplicate T1 should - // not be allowed. - ){ - // Note that duplicate short var declarations resolve to their alt declaration. - x /* @x */ := 0 - y /* =@y */ := 0 - T1 /* @T1 */ := 0 - var t1var /* =@t1var */ T1 /* @T1 */ -} - -// From issue #39634 -func(*ph1[e, e])h(d) diff --git a/internal/backport/go/parser/testdata/set.go2 b/internal/backport/go/parser/testdata/set.go2 deleted file mode 100644 index 0da6377cbd..0000000000 --- a/internal/backport/go/parser/testdata/set.go2 +++ /dev/null @@ -1,31 +0,0 @@ -// Package set implements sets of any type. -package set - -type Set[Elem comparable] map[Elem]struct{} - -func Make[Elem comparable]() Set[Elem] { - return make(Set(Elem)) -} - -func (s Set[Elem]) Add(v Elem) { - s[v] = struct{}{} -} - -func (s Set[Elem]) Delete(v Elem) { - delete(s, v) -} - -func (s Set[Elem]) Contains(v Elem) bool { - _, ok := s[v] - return ok -} - -func (s Set[Elem]) Len() int { - return len(s) -} - -func (s Set[Elem]) Iterate(f func(Elem)) { - for v := range s { - f(v) - } -} diff --git a/internal/backport/go/parser/testdata/slices.go2 b/internal/backport/go/parser/testdata/slices.go2 deleted file mode 100644 index e060212f29..0000000000 --- a/internal/backport/go/parser/testdata/slices.go2 +++ /dev/null @@ -1,31 +0,0 @@ -// Package slices implements various slice algorithms. -package slices - -// Map turns a []T1 to a []T2 using a mapping function. -func Map[T1, T2 any](s []T1, f func(T1) T2) []T2 { - r := make([]T2, len(s)) - for i, v := range s { - r[i] = f(v) - } - return r -} - -// Reduce reduces a []T1 to a single value using a reduction function. -func Reduce[T1, T2 any](s []T1, initializer T2, f func(T2, T1) T2) T2 { - r := initializer - for _, v := range s { - r = f(r, v) - } - return r -} - -// Filter filters values from a slice using a filter function. -func Filter[T any](s []T, f func(T) bool) []T { - var r []T - for _, v := range s { - if f(v) { - r = append(r, v) - } - } - return r -} diff --git a/internal/backport/go/parser/testdata/sort.go2 b/internal/backport/go/parser/testdata/sort.go2 deleted file mode 100644 index 88be79f966..0000000000 --- a/internal/backport/go/parser/testdata/sort.go2 +++ /dev/null @@ -1,27 +0,0 @@ -package sort - -type orderedSlice[Elem comparable] []Elem - -func (s orderedSlice[Elem]) Len() int { return len(s) } -func (s orderedSlice[Elem]) Less(i, j int) bool { return s[i] < s[j] } -func (s orderedSlice[Elem]) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// OrderedSlice sorts the slice s in ascending order. -// The elements of s must be ordered using the < operator. -func OrderedSlice[Elem comparable](s []Elem) { - sort.Sort(orderedSlice[Elem](s)) -} - -type sliceFn[Elem any] struct { - s []Elem - f func(Elem, Elem) bool -} - -func (s sliceFn[Elem]) Len() int { return len(s.s) } -func (s sliceFn[Elem]) Less(i, j int) bool { return s.f(s.s[i], s.s[j]) } -func (s sliceFn[Elem]) Swap(i, j int) { s.s[i], s.s[j] = s.s[j], s.s[i] } - -// SliceFn sorts the slice s according to the function f. -func SliceFn[Elem any](s []Elem, f func(Elem, Elem) bool) { - Sort(sliceFn[Elem]{s, f}) -} diff --git a/internal/backport/go/parser/testdata/tparams.go2 b/internal/backport/go/parser/testdata/tparams.go2 deleted file mode 100644 index 28fd132243..0000000000 --- a/internal/backport/go/parser/testdata/tparams.go2 +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p - -type _[a /* ERROR "all type parameters must be named" */, b] struct{} -type _[a t, b t, c /* ERROR "all type parameters must be named" */ ] struct{} -type _ struct { - t [n]byte - t[a] - t[a, b] -} -type _ interface { - t[a] - m[ /* ERROR "method must have no type parameters" */ _ _, /* ERROR mixed */ _]() - t[a, b] -} - -func _[] /* ERROR "empty type parameter list" */ () -func _[a /* ERROR "all type parameters must be named" */, b ]() -func _[a t, b t, c /* ERROR "all type parameters must be named" */ ]() - -// TODO(rfindley) incorrect error message (see existing TODO in parser) -func f[a b, 0 /* ERROR "expected '\)', found 0" */ ] () - -// issue #49482 -type ( - _[a *[]int] struct{} - _[a *t,] struct{} - _[a *t|[]int] struct{} - _[a *t|t,] struct{} - _[a *t|~t,] struct{} - _[a *struct{}|t] struct{} - _[a *t|struct{}] struct{} - _[a *struct{}|~t] struct{} -) - -// issue #51488 -type ( - _[a *t|t,] struct{} - _[a *t|t, b t] struct{} - _[a *t|t] struct{} - _[a *[]t|t] struct{} - _[a ([]t)] struct{} - _[a ([]t)|t] struct{} -) diff --git a/internal/backport/go/parser/testdata/typeparams.src b/internal/backport/go/parser/testdata/typeparams.src deleted file mode 100644 index 479cb96871..0000000000 --- a/internal/backport/go/parser/testdata/typeparams.src +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Test cases for error messages produced while parsing code that uses type -// parameters, without ParseTypeParams being enabled. - -package p - -type List[E any /* ERROR "expected ']', found any" */ ] []E - -type Pair[L, /* ERROR "unexpected comma" */ R any] struct { - Left L - Right R -} - -var _ = Pair[int, /* ERROR "expected ']' or ':', found ','" */ string]{} diff --git a/internal/backport/go/parser/testdata/typeset.go2 b/internal/backport/go/parser/testdata/typeset.go2 deleted file mode 100644 index 7844c22212..0000000000 --- a/internal/backport/go/parser/testdata/typeset.go2 +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains test cases for typeset-only constraint elements. -// TODO(gri) gofmt once/if gofmt supports this notation. - -package p - -type ( - _[_ t] t - _[_ ~t] t - _[_ t|t] t - _[_ ~t|t] t - _[_ t|~t] t - _[_ ~t|~t] t - - _[_ t, _, _ t|t] t - _[_ t, _, _ ~t|t] t - _[_ t, _, _ t|~t] t - _[_ t, _, _ ~t|~t] t - - _[_ t.t] t - _[_ ~t.t] t - _[_ t.t|t.t] t - _[_ ~t.t|t.t] t - _[_ t.t|~t.t] t - _[_ ~t.t|~t.t] t - - _[_ t, _, _ t.t|t.t] t - _[_ t, _, _ ~t.t|t.t] t - _[_ t, _, _ t.t|~t.t] t - _[_ t, _, _ ~t.t|~t.t] t - - _[_ struct{}] t - _[_ ~struct{}] t - - _[_ struct{}|t] t - _[_ ~struct{}|t] t - _[_ struct{}|~t] t - _[_ ~struct{}|~t] t - - _[_ t|struct{}] t - _[_ ~t|struct{}] t - _[_ t|~struct{}] t - _[_ ~t|~struct{}] t -) - -// Single-expression type parameter lists and those that don't start -// with a (type parameter) name are considered array sizes. -// The term must be a valid expression (it could be a type incl. a -// tilde term) but the type-checker will complain. -type ( - _[t] t - _[t|t] t - - // These are invalid and the type-checker will complain. - _[~t] t - _[~t|t] t - _[t|~t] t - _[~t|~t] t -) - -type _[_ t, t /* ERROR "type parameters must be named" */ ] t -type _[_ ~t, t /* ERROR "type parameters must be named" */ ] t -type _[_ t, ~ /* ERROR "type parameters must be named" */ t] t -type _[_ ~t, ~ /* ERROR "type parameters must be named" */ t] t - -type _[_ t|t, t /* ERROR "type parameters must be named" */ |t] t -type _[_ ~t|t, t /* ERROR "type parameters must be named" */ |t] t -type _[_ t|t, ~ /* ERROR "type parameters must be named" */ t|t] t -type _[_ ~t|t, ~ /* ERROR "type parameters must be named" */ t|t] t diff --git a/internal/backport/go/printer/comment.go b/internal/backport/go/printer/comment.go deleted file mode 100644 index 663c528d07..0000000000 --- a/internal/backport/go/printer/comment.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package printer - -import ( - "strings" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/doc/comment" -) - -// formatDocComment reformats the doc comment list, -// returning the canonical formatting. -func formatDocComment(list []*ast.Comment) []*ast.Comment { - // Extract comment text (removing comment markers). - var kind, text string - var directives []*ast.Comment - if len(list) == 1 && strings.HasPrefix(list[0].Text, "/*") { - kind = "/*" - text = list[0].Text - if !strings.Contains(text, "\n") || allStars(text) { - // Single-line /* .. */ comment in doc comment position, - // or multiline old-style comment like - // /* - // * Comment - // * text here. - // */ - // Should not happen, since it will not work well as a - // doc comment, but if it does, just ignore: - // reformatting it will only make the situation worse. - return list - } - text = text[2 : len(text)-2] // cut /* and */ - } else if strings.HasPrefix(list[0].Text, "//") { - kind = "//" - var b strings.Builder - for _, c := range list { - if !strings.HasPrefix(c.Text, "//") { - return list - } - // Accumulate //go:build etc lines separately. - if isDirective(c.Text[2:]) { - directives = append(directives, c) - continue - } - b.WriteString(strings.TrimPrefix(c.Text[2:], " ")) - b.WriteString("\n") - } - text = b.String() - } else { - // Not sure what this is, so leave alone. - return list - } - - if text == "" { - return list - } - - // Parse comment and reformat as text. - var p comment.Parser - d := p.Parse(text) - - var pr comment.Printer - text = string(pr.Comment(d)) - - // For /* */ comment, return one big comment with text inside. - slash := list[0].Slash - if kind == "/*" { - c := &ast.Comment{ - Slash: slash, - Text: "/*\n" + text + "*/", - } - return []*ast.Comment{c} - } - - // For // comment, return sequence of // lines. - var out []*ast.Comment - for text != "" { - var line string - line, text, _ = stringsCut(text, "\n") - if line == "" { - line = "//" - } else if strings.HasPrefix(line, "\t") { - line = "//" + line - } else { - line = "// " + line - } - out = append(out, &ast.Comment{ - Slash: slash, - Text: line, - }) - } - if len(directives) > 0 { - out = append(out, &ast.Comment{ - Slash: slash, - Text: "//", - }) - for _, c := range directives { - out = append(out, &ast.Comment{ - Slash: slash, - Text: c.Text, - }) - } - } - return out -} - -// isDirective reports whether c is a comment directive. -// See go.dev/issue/37974. -// This code is also in go/ast. -func isDirective(c string) bool { - // "//line " is a line directive. - // "//extern " is for gccgo. - // "//export " is for cgo. - // (The // has been removed.) - if strings.HasPrefix(c, "line ") || strings.HasPrefix(c, "extern ") || strings.HasPrefix(c, "export ") { - return true - } - - // "//[a-z0-9]+:[a-z0-9]" - // (The // has been removed.) - colon := strings.Index(c, ":") - if colon <= 0 || colon+1 >= len(c) { - return false - } - for i := 0; i <= colon+1; i++ { - if i == colon { - continue - } - b := c[i] - if !('a' <= b && b <= 'z' || '0' <= b && b <= '9') { - return false - } - } - return true -} - -// allStars reports whether text is the interior of an -// old-style /* */ comment with a star at the start of each line. -func allStars(text string) bool { - for i := 0; i < len(text); i++ { - if text[i] == '\n' { - j := i + 1 - for j < len(text) && (text[j] == ' ' || text[j] == '\t') { - j++ - } - if j < len(text) && text[j] != '*' { - return false - } - } - } - return true -} diff --git a/internal/backport/go/printer/example_test.go b/internal/backport/go/printer/example_test.go deleted file mode 100644 index 0df644d918..0000000000 --- a/internal/backport/go/printer/example_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package printer_test - -import ( - "bytes" - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/printer" - "golang.org/x/website/internal/backport/go/token" - "strings" - "testing" -) - -// Dummy test function so that godoc does not use the entire file as example. -func Test(*testing.T) {} - -func parseFunc(filename, functionname string) (fun *ast.FuncDecl, fset *token.FileSet) { - fset = token.NewFileSet() - if file, err := parser.ParseFile(fset, filename, nil, 0); err == nil { - for _, d := range file.Decls { - if f, ok := d.(*ast.FuncDecl); ok && f.Name.Name == functionname { - fun = f - return - } - } - } - panic("function not found") -} - -func ExampleFprint() { - // Parse source file and extract the AST without comments for - // this function, with position information referring to the - // file set fset. - funcAST, fset := parseFunc("example_test.go", "ExampleFprint") - - // Print the function body into buffer buf. - // The file set is provided to the printer so that it knows - // about the original source formatting and can add additional - // line breaks where they were present in the source. - var buf bytes.Buffer - printer.Fprint(&buf, fset, funcAST.Body) - - // Remove braces {} enclosing the function body, unindent, - // and trim leading and trailing white space. - s := buf.String() - s = s[1 : len(s)-1] - s = strings.TrimSpace(strings.ReplaceAll(s, "\n\t", "\n")) - - // Print the cleaned-up body text to stdout. - fmt.Println(s) - - // output: - // funcAST, fset := parseFunc("example_test.go", "ExampleFprint") - // - // var buf bytes.Buffer - // printer.Fprint(&buf, fset, funcAST.Body) - // - // s := buf.String() - // s = s[1 : len(s)-1] - // s = strings.TrimSpace(strings.ReplaceAll(s, "\n\t", "\n")) - // - // fmt.Println(s) -} diff --git a/internal/backport/go/printer/gobuild.go b/internal/backport/go/printer/gobuild.go deleted file mode 100644 index f00492d077..0000000000 --- a/internal/backport/go/printer/gobuild.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package printer - -import ( - "go/build/constraint" - "sort" - "text/tabwriter" -) - -func (p *printer) fixGoBuildLines() { - if len(p.goBuild)+len(p.plusBuild) == 0 { - return - } - - // Find latest possible placement of //go:build and // +build comments. - // That's just after the last blank line before we find a non-comment. - // (We'll add another blank line after our comment block.) - // When we start dropping // +build comments, we can skip over /* */ comments too. - // Note that we are processing tabwriter input, so every comment - // begins and ends with a tabwriter.Escape byte. - // And some newlines have turned into \f bytes. - insert := 0 - for pos := 0; ; { - // Skip leading space at beginning of line. - blank := true - for pos < len(p.output) && (p.output[pos] == ' ' || p.output[pos] == '\t') { - pos++ - } - // Skip over // comment if any. - if pos+3 < len(p.output) && p.output[pos] == tabwriter.Escape && p.output[pos+1] == '/' && p.output[pos+2] == '/' { - blank = false - for pos < len(p.output) && !isNL(p.output[pos]) { - pos++ - } - } - // Skip over \n at end of line. - if pos >= len(p.output) || !isNL(p.output[pos]) { - break - } - pos++ - - if blank { - insert = pos - } - } - - // If there is a //go:build comment before the place we identified, - // use that point instead. (Earlier in the file is always fine.) - if len(p.goBuild) > 0 && p.goBuild[0] < insert { - insert = p.goBuild[0] - } else if len(p.plusBuild) > 0 && p.plusBuild[0] < insert { - insert = p.plusBuild[0] - } - - var x constraint.Expr - switch len(p.goBuild) { - case 0: - // Synthesize //go:build expression from // +build lines. - for _, pos := range p.plusBuild { - y, err := constraint.Parse(p.commentTextAt(pos)) - if err != nil { - x = nil - break - } - if x == nil { - x = y - } else { - x = &constraint.AndExpr{X: x, Y: y} - } - } - case 1: - // Parse //go:build expression. - x, _ = constraint.Parse(p.commentTextAt(p.goBuild[0])) - } - - var block []byte - if x == nil { - // Don't have a valid //go:build expression to treat as truth. - // Bring all the lines together but leave them alone. - // Note that these are already tabwriter-escaped. - for _, pos := range p.goBuild { - block = append(block, p.lineAt(pos)...) - } - for _, pos := range p.plusBuild { - block = append(block, p.lineAt(pos)...) - } - } else { - block = append(block, tabwriter.Escape) - block = append(block, "//go:build "...) - block = append(block, x.String()...) - block = append(block, tabwriter.Escape, '\n') - if len(p.plusBuild) > 0 { - lines, err := constraint.PlusBuildLines(x) - if err != nil { - lines = []string{"// +build error: " + err.Error()} - } - for _, line := range lines { - block = append(block, tabwriter.Escape) - block = append(block, line...) - block = append(block, tabwriter.Escape, '\n') - } - } - } - block = append(block, '\n') - - // Build sorted list of lines to delete from remainder of output. - toDelete := append(p.goBuild, p.plusBuild...) - sort.Ints(toDelete) - - // Collect output after insertion point, with lines deleted, into after. - var after []byte - start := insert - for _, end := range toDelete { - if end < start { - continue - } - after = appendLines(after, p.output[start:end]) - start = end + len(p.lineAt(end)) - } - after = appendLines(after, p.output[start:]) - if n := len(after); n >= 2 && isNL(after[n-1]) && isNL(after[n-2]) { - after = after[:n-1] - } - - p.output = p.output[:insert] - p.output = append(p.output, block...) - p.output = append(p.output, after...) -} - -// appendLines is like append(x, y...) -// but it avoids creating doubled blank lines, -// which would not be gofmt-standard output. -// It assumes that only whole blocks of lines are being appended, -// not line fragments. -func appendLines(x, y []byte) []byte { - if len(y) > 0 && isNL(y[0]) && // y starts in blank line - (len(x) == 0 || len(x) >= 2 && isNL(x[len(x)-1]) && isNL(x[len(x)-2])) { // x is empty or ends in blank line - y = y[1:] // delete y's leading blank line - } - return append(x, y...) -} - -func (p *printer) lineAt(start int) []byte { - pos := start - for pos < len(p.output) && !isNL(p.output[pos]) { - pos++ - } - if pos < len(p.output) { - pos++ - } - return p.output[start:pos] -} - -func (p *printer) commentTextAt(start int) string { - if start < len(p.output) && p.output[start] == tabwriter.Escape { - start++ - } - pos := start - for pos < len(p.output) && p.output[pos] != tabwriter.Escape && !isNL(p.output[pos]) { - pos++ - } - return string(p.output[start:pos]) -} - -func isNL(b byte) bool { - return b == '\n' || b == '\f' -} diff --git a/internal/backport/go/printer/nodes.go b/internal/backport/go/printer/nodes.go deleted file mode 100644 index 8358c91a92..0000000000 --- a/internal/backport/go/printer/nodes.go +++ /dev/null @@ -1,1921 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements printing of AST nodes; specifically -// expressions, statements, declarations, and files. It uses -// the print functionality implemented in printer.go. - -package printer - -import ( - "bytes" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" - "math" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// Formatting issues: -// - better comment formatting for /*-style comments at the end of a line (e.g. a declaration) -// when the comment spans multiple lines; if such a comment is just two lines, formatting is -// not idempotent -// - formatting of expression lists -// - should use blank instead of tab to separate one-line function bodies from -// the function header unless there is a group of consecutive one-liners - -// ---------------------------------------------------------------------------- -// Common AST nodes. - -// Print as many newlines as necessary (but at least min newlines) to get to -// the current line. ws is printed before the first line break. If newSection -// is set, the first line break is printed as formfeed. Returns 0 if no line -// breaks were printed, returns 1 if there was exactly one newline printed, -// and returns a value > 1 if there was a formfeed or more than one newline -// printed. -// -// TODO(gri): linebreak may add too many lines if the next statement at "line" -// is preceded by comments because the computation of n assumes -// the current position before the comment and the target position -// after the comment. Thus, after interspersing such comments, the -// space taken up by them is not considered to reduce the number of -// linebreaks. At the moment there is no easy way to know about -// future (not yet interspersed) comments in this function. -func (p *printer) linebreak(line, min int, ws whiteSpace, newSection bool) (nbreaks int) { - n := nlimit(line - p.pos.Line) - if n < min { - n = min - } - if n > 0 { - p.print(ws) - if newSection { - p.print(formfeed) - n-- - nbreaks = 2 - } - nbreaks += n - for ; n > 0; n-- { - p.print(newline) - } - } - return -} - -// setComment sets g as the next comment if g != nil and if node comments -// are enabled - this mode is used when printing source code fragments such -// as exports only. It assumes that there is no pending comment in p.comments -// and at most one pending comment in the p.comment cache. -func (p *printer) setComment(g *ast.CommentGroup) { - if g == nil || !p.useNodeComments { - return - } - if p.comments == nil { - // initialize p.comments lazily - p.comments = make([]*ast.CommentGroup, 1) - } else if p.cindex < len(p.comments) { - // for some reason there are pending comments; this - // should never happen - handle gracefully and flush - // all comments up to g, ignore anything after that - p.flush(p.posFor(g.List[0].Pos()), token.ILLEGAL) - p.comments = p.comments[0:1] - // in debug mode, report error - p.internalError("setComment found pending comments") - } - p.comments[0] = g - p.cindex = 0 - // don't overwrite any pending comment in the p.comment cache - // (there may be a pending comment when a line comment is - // immediately followed by a lead comment with no other - // tokens between) - if p.commentOffset == infinity { - p.nextComment() // get comment ready for use - } -} - -type exprListMode uint - -const ( - commaTerm exprListMode = 1 << iota // list is optionally terminated by a comma - noIndent // no extra indentation in multi-line lists -) - -// If indent is set, a multi-line identifier list is indented after the -// first linebreak encountered. -func (p *printer) identList(list []*ast.Ident, indent bool) { - // convert into an expression list so we can re-use exprList formatting - xlist := make([]ast.Expr, len(list)) - for i, x := range list { - xlist[i] = x - } - var mode exprListMode - if !indent { - mode = noIndent - } - p.exprList(token.NoPos, xlist, 1, mode, token.NoPos, false) -} - -const filteredMsg = "contains filtered or unexported fields" - -// Print a list of expressions. If the list spans multiple -// source lines, the original line breaks are respected between -// expressions. -// -// TODO(gri) Consider rewriting this to be independent of []ast.Expr -// so that we can use the algorithm for any kind of list -// -// (e.g., pass list via a channel over which to range). -func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exprListMode, next0 token.Pos, isIncomplete bool) { - if len(list) == 0 { - if isIncomplete { - prev := p.posFor(prev0) - next := p.posFor(next0) - if prev.IsValid() && prev.Line == next.Line { - p.print("/* " + filteredMsg + " */") - } else { - p.print(newline) - p.print(indent, "// "+filteredMsg, unindent, newline) - } - } - return - } - - prev := p.posFor(prev0) - next := p.posFor(next0) - line := p.lineFor(list[0].Pos()) - endLine := p.lineFor(list[len(list)-1].End()) - - if prev.IsValid() && prev.Line == line && line == endLine { - // all list entries on a single line - for i, x := range list { - if i > 0 { - // use position of expression following the comma as - // comma position for correct comment placement - p.print(x.Pos(), token.COMMA, blank) - } - p.expr0(x, depth) - } - if isIncomplete { - p.print(token.COMMA, blank, "/* "+filteredMsg+" */") - } - return - } - - // list entries span multiple lines; - // use source code positions to guide line breaks - - // Don't add extra indentation if noIndent is set; - // i.e., pretend that the first line is already indented. - ws := ignore - if mode&noIndent == 0 { - ws = indent - } - - // The first linebreak is always a formfeed since this section must not - // depend on any previous formatting. - prevBreak := -1 // index of last expression that was followed by a linebreak - if prev.IsValid() && prev.Line < line && p.linebreak(line, 0, ws, true) > 0 { - ws = ignore - prevBreak = 0 - } - - // initialize expression/key size: a zero value indicates expr/key doesn't fit on a single line - size := 0 - - // We use the ratio between the geometric mean of the previous key sizes and - // the current size to determine if there should be a break in the alignment. - // To compute the geometric mean we accumulate the ln(size) values (lnsum) - // and the number of sizes included (count). - lnsum := 0.0 - count := 0 - - // print all list elements - prevLine := prev.Line - for i, x := range list { - line = p.lineFor(x.Pos()) - - // Determine if the next linebreak, if any, needs to use formfeed: - // in general, use the entire node size to make the decision; for - // key:value expressions, use the key size. - // TODO(gri) for a better result, should probably incorporate both - // the key and the node size into the decision process - useFF := true - - // Determine element size: All bets are off if we don't have - // position information for the previous and next token (likely - // generated code - simply ignore the size in this case by setting - // it to 0). - prevSize := size - const infinity = 1e6 // larger than any source line - size = p.nodeSize(x, infinity) - pair, isPair := x.(*ast.KeyValueExpr) - if size <= infinity && prev.IsValid() && next.IsValid() { - // x fits on a single line - if isPair { - size = p.nodeSize(pair.Key, infinity) // size <= infinity - } - } else { - // size too large or we don't have good layout information - size = 0 - } - - // If the previous line and the current line had single- - // line-expressions and the key sizes are small or the - // ratio between the current key and the geometric mean - // if the previous key sizes does not exceed a threshold, - // align columns and do not use formfeed. - if prevSize > 0 && size > 0 { - const smallSize = 40 - if count == 0 || prevSize <= smallSize && size <= smallSize { - useFF = false - } else { - const r = 2.5 // threshold - geomean := math.Exp(lnsum / float64(count)) // count > 0 - ratio := float64(size) / geomean - useFF = r*ratio <= 1 || r <= ratio - } - } - - needsLinebreak := 0 < prevLine && prevLine < line - if i > 0 { - // Use position of expression following the comma as - // comma position for correct comment placement, but - // only if the expression is on the same line. - if !needsLinebreak { - p.print(x.Pos()) - } - p.print(token.COMMA) - needsBlank := true - if needsLinebreak { - // Lines are broken using newlines so comments remain aligned - // unless useFF is set or there are multiple expressions on - // the same line in which case formfeed is used. - nbreaks := p.linebreak(line, 0, ws, useFF || prevBreak+1 < i) - if nbreaks > 0 { - ws = ignore - prevBreak = i - needsBlank = false // we got a line break instead - } - // If there was a new section or more than one new line - // (which means that the tabwriter will implicitly break - // the section), reset the geomean variables since we are - // starting a new group of elements with the next element. - if nbreaks > 1 { - lnsum = 0 - count = 0 - } - } - if needsBlank { - p.print(blank) - } - } - - if len(list) > 1 && isPair && size > 0 && needsLinebreak { - // We have a key:value expression that fits onto one line - // and it's not on the same line as the prior expression: - // Use a column for the key such that consecutive entries - // can align if possible. - // (needsLinebreak is set if we started a new line before) - p.expr(pair.Key) - p.print(pair.Colon, token.COLON, vtab) - p.expr(pair.Value) - } else { - p.expr0(x, depth) - } - - if size > 0 { - lnsum += math.Log(float64(size)) - count++ - } - - prevLine = line - } - - if mode&commaTerm != 0 && next.IsValid() && p.pos.Line < next.Line { - // Print a terminating comma if the next token is on a new line. - p.print(token.COMMA) - if isIncomplete { - p.print(newline) - p.print("// " + filteredMsg) - } - if ws == ignore && mode&noIndent == 0 { - // unindent if we indented - p.print(unindent) - } - p.print(formfeed) // terminating comma needs a line break to look good - return - } - - if isIncomplete { - p.print(token.COMMA, newline) - p.print("// "+filteredMsg, newline) - } - - if ws == ignore && mode&noIndent == 0 { - // unindent if we indented - p.print(unindent) - } -} - -type paramMode int - -const ( - funcParam paramMode = iota - funcTParam - typeTParam -) - -func (p *printer) parameters(fields *ast.FieldList, mode paramMode) { - openTok, closeTok := token.LPAREN, token.RPAREN - if mode != funcParam { - openTok, closeTok = token.LBRACK, token.RBRACK - } - p.print(fields.Opening, openTok) - if len(fields.List) > 0 { - prevLine := p.lineFor(fields.Opening) - ws := indent - for i, par := range fields.List { - // determine par begin and end line (may be different - // if there are multiple parameter names for this par - // or the type is on a separate line) - parLineBeg := p.lineFor(par.Pos()) - parLineEnd := p.lineFor(par.End()) - // separating "," if needed - needsLinebreak := 0 < prevLine && prevLine < parLineBeg - if i > 0 { - // use position of parameter following the comma as - // comma position for correct comma placement, but - // only if the next parameter is on the same line - if !needsLinebreak { - p.print(par.Pos()) - } - p.print(token.COMMA) - } - // separator if needed (linebreak or blank) - if needsLinebreak && p.linebreak(parLineBeg, 0, ws, true) > 0 { - // break line if the opening "(" or previous parameter ended on a different line - ws = ignore - } else if i > 0 { - p.print(blank) - } - // parameter names - if len(par.Names) > 0 { - // Very subtle: If we indented before (ws == ignore), identList - // won't indent again. If we didn't (ws == indent), identList will - // indent if the identList spans multiple lines, and it will outdent - // again at the end (and still ws == indent). Thus, a subsequent indent - // by a linebreak call after a type, or in the next multi-line identList - // will do the right thing. - p.identList(par.Names, ws == indent) - p.print(blank) - } - // parameter type - p.expr(stripParensAlways(par.Type)) - prevLine = parLineEnd - } - - // if the closing ")" is on a separate line from the last parameter, - // print an additional "," and line break - if closing := p.lineFor(fields.Closing); 0 < prevLine && prevLine < closing { - p.print(token.COMMA) - p.linebreak(closing, 0, ignore, true) - } else if mode == typeTParam && fields.NumFields() == 1 && combinesWithName(fields.List[0].Type) { - // A type parameter list [P T] where the name P and the type expression T syntactically - // combine to another valid (value) expression requires a trailing comma, as in [P *T,] - // (or an enclosing interface as in [P interface(*T)]), so that the type parameter list - // is not parsed as an array length [P*T]. - p.print(token.COMMA) - } - - // unindent if we indented - if ws == ignore { - p.print(unindent) - } - } - - p.print(fields.Closing, closeTok) -} - -// combinesWithName reports whether a name followed by the expression x -// syntactically combines to another valid (value) expression. For instance -// using *T for x, "name *T" syntactically appears as the expression x*T. -// On the other hand, using P|Q or *P|~Q for x, "name P|Q" or name *P|~Q" -// cannot be combined into a valid (value) expression. -func combinesWithName(x ast.Expr) bool { - switch x := x.(type) { - case *ast.StarExpr: - // name *x.X combines to name*x.X if x.X is not a type element - return !isTypeElem(x.X) - case *ast.BinaryExpr: - return combinesWithName(x.X) && !isTypeElem(x.Y) - case *ast.ParenExpr: - // name(x) combines but we are making sure at - // the call site that x is never parenthesized. - panic("unexpected parenthesized expression") - } - return false -} - -// isTypeElem reports whether x is a (possibly parenthesized) type element expression. -// The result is false if x could be a type element OR an ordinary (value) expression. -func isTypeElem(x ast.Expr) bool { - switch x := x.(type) { - case *ast.ArrayType, *ast.StructType, *ast.FuncType, *ast.InterfaceType, *ast.MapType, *ast.ChanType: - return true - case *ast.UnaryExpr: - return x.Op == token.TILDE - case *ast.BinaryExpr: - return isTypeElem(x.X) || isTypeElem(x.Y) - case *ast.ParenExpr: - return isTypeElem(x.X) - } - return false -} - -func (p *printer) signature(sig *ast.FuncType) { - if sig.TypeParams != nil { - p.parameters(sig.TypeParams, funcTParam) - } - if sig.Params != nil { - p.parameters(sig.Params, funcParam) - } else { - p.print(token.LPAREN, token.RPAREN) - } - res := sig.Results - n := res.NumFields() - if n > 0 { - // res != nil - p.print(blank) - if n == 1 && res.List[0].Names == nil { - // single anonymous res; no ()'s - p.expr(stripParensAlways(res.List[0].Type)) - return - } - p.parameters(res, funcParam) - } -} - -func identListSize(list []*ast.Ident, maxSize int) (size int) { - for i, x := range list { - if i > 0 { - size += len(", ") - } - size += utf8.RuneCountInString(x.Name) - if size >= maxSize { - break - } - } - return -} - -func (p *printer) isOneLineFieldList(list []*ast.Field) bool { - if len(list) != 1 { - return false // allow only one field - } - f := list[0] - if f.Tag != nil || f.Comment != nil { - return false // don't allow tags or comments - } - // only name(s) and type - const maxSize = 30 // adjust as appropriate, this is an approximate value - namesSize := identListSize(f.Names, maxSize) - if namesSize > 0 { - namesSize = 1 // blank between names and types - } - typeSize := p.nodeSize(f.Type, maxSize) - return namesSize+typeSize <= maxSize -} - -func (p *printer) setLineComment(text string) { - p.setComment(&ast.CommentGroup{List: []*ast.Comment{{Slash: token.NoPos, Text: text}}}) -} - -func (p *printer) fieldList(fields *ast.FieldList, isStruct, isIncomplete bool) { - lbrace := fields.Opening - list := fields.List - rbrace := fields.Closing - hasComments := isIncomplete || p.commentBefore(p.posFor(rbrace)) - srcIsOneLine := lbrace.IsValid() && rbrace.IsValid() && p.lineFor(lbrace) == p.lineFor(rbrace) - - if !hasComments && srcIsOneLine { - // possibly a one-line struct/interface - if len(list) == 0 { - // no blank between keyword and {} in this case - p.print(lbrace, token.LBRACE, rbrace, token.RBRACE) - return - } else if p.isOneLineFieldList(list) { - // small enough - print on one line - // (don't use identList and ignore source line breaks) - p.print(lbrace, token.LBRACE, blank) - f := list[0] - if isStruct { - for i, x := range f.Names { - if i > 0 { - // no comments so no need for comma position - p.print(token.COMMA, blank) - } - p.expr(x) - } - if len(f.Names) > 0 { - p.print(blank) - } - p.expr(f.Type) - } else { // interface - if len(f.Names) > 0 { - name := f.Names[0] // method name - p.expr(name) - p.signature(f.Type.(*ast.FuncType)) // don't print "func" - } else { - // embedded interface - p.expr(f.Type) - } - } - p.print(blank, rbrace, token.RBRACE) - return - } - } - // hasComments || !srcIsOneLine - - p.print(blank, lbrace, token.LBRACE, indent) - if hasComments || len(list) > 0 { - p.print(formfeed) - } - - if isStruct { - - sep := vtab - if len(list) == 1 { - sep = blank - } - var line int - for i, f := range list { - if i > 0 { - p.linebreak(p.lineFor(f.Pos()), 1, ignore, p.linesFrom(line) > 0) - } - extraTabs := 0 - p.setComment(f.Doc) - p.recordLine(&line) - if len(f.Names) > 0 { - // named fields - p.identList(f.Names, false) - p.print(sep) - p.expr(f.Type) - extraTabs = 1 - } else { - // anonymous field - p.expr(f.Type) - extraTabs = 2 - } - if f.Tag != nil { - if len(f.Names) > 0 && sep == vtab { - p.print(sep) - } - p.print(sep) - p.expr(f.Tag) - extraTabs = 0 - } - if f.Comment != nil { - for ; extraTabs > 0; extraTabs-- { - p.print(sep) - } - p.setComment(f.Comment) - } - } - if isIncomplete { - if len(list) > 0 { - p.print(formfeed) - } - p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment - p.setLineComment("// " + filteredMsg) - } - - } else { // interface - - var line int - var prev *ast.Ident // previous "type" identifier - for i, f := range list { - var name *ast.Ident // first name, or nil - if len(f.Names) > 0 { - name = f.Names[0] - } - if i > 0 { - // don't do a line break (min == 0) if we are printing a list of types - // TODO(gri) this doesn't work quite right if the list of types is - // spread across multiple lines - min := 1 - if prev != nil && name == prev { - min = 0 - } - p.linebreak(p.lineFor(f.Pos()), min, ignore, p.linesFrom(line) > 0) - } - p.setComment(f.Doc) - p.recordLine(&line) - if name != nil { - // method - p.expr(name) - p.signature(f.Type.(*ast.FuncType)) // don't print "func" - prev = nil - } else { - // embedded interface - p.expr(f.Type) - prev = nil - } - p.setComment(f.Comment) - } - if isIncomplete { - if len(list) > 0 { - p.print(formfeed) - } - p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment - p.setLineComment("// contains filtered or unexported methods") - } - - } - p.print(unindent, formfeed, rbrace, token.RBRACE) -} - -// ---------------------------------------------------------------------------- -// Expressions - -func walkBinary(e *ast.BinaryExpr) (has4, has5 bool, maxProblem int) { - switch e.Op.Precedence() { - case 4: - has4 = true - case 5: - has5 = true - } - - switch l := e.X.(type) { - case *ast.BinaryExpr: - if l.Op.Precedence() < e.Op.Precedence() { - // parens will be inserted. - // pretend this is an *ast.ParenExpr and do nothing. - break - } - h4, h5, mp := walkBinary(l) - has4 = has4 || h4 - has5 = has5 || h5 - if maxProblem < mp { - maxProblem = mp - } - } - - switch r := e.Y.(type) { - case *ast.BinaryExpr: - if r.Op.Precedence() <= e.Op.Precedence() { - // parens will be inserted. - // pretend this is an *ast.ParenExpr and do nothing. - break - } - h4, h5, mp := walkBinary(r) - has4 = has4 || h4 - has5 = has5 || h5 - if maxProblem < mp { - maxProblem = mp - } - - case *ast.StarExpr: - if e.Op == token.QUO { // `*/` - maxProblem = 5 - } - - case *ast.UnaryExpr: - switch e.Op.String() + r.Op.String() { - case "/*", "&&", "&^": - maxProblem = 5 - case "++", "--": - if maxProblem < 4 { - maxProblem = 4 - } - } - } - return -} - -func cutoff(e *ast.BinaryExpr, depth int) int { - has4, has5, maxProblem := walkBinary(e) - if maxProblem > 0 { - return maxProblem + 1 - } - if has4 && has5 { - if depth == 1 { - return 5 - } - return 4 - } - if depth == 1 { - return 6 - } - return 4 -} - -func diffPrec(expr ast.Expr, prec int) int { - x, ok := expr.(*ast.BinaryExpr) - if !ok || prec != x.Op.Precedence() { - return 1 - } - return 0 -} - -func reduceDepth(depth int) int { - depth-- - if depth < 1 { - depth = 1 - } - return depth -} - -// Format the binary expression: decide the cutoff and then format. -// Let's call depth == 1 Normal mode, and depth > 1 Compact mode. -// (Algorithm suggestion by Russ Cox.) -// -// The precedences are: -// -// 5 * / % << >> & &^ -// 4 + - | ^ -// 3 == != < <= > >= -// 2 && -// 1 || -// -// The only decision is whether there will be spaces around levels 4 and 5. -// There are never spaces at level 6 (unary), and always spaces at levels 3 and below. -// -// To choose the cutoff, look at the whole expression but excluding primary -// expressions (function calls, parenthesized exprs), and apply these rules: -// -// 1. If there is a binary operator with a right side unary operand -// that would clash without a space, the cutoff must be (in order): -// -// /* 6 -// && 6 -// &^ 6 -// ++ 5 -// -- 5 -// -// (Comparison operators always have spaces around them.) -// -// 2. If there is a mix of level 5 and level 4 operators, then the cutoff -// is 5 (use spaces to distinguish precedence) in Normal mode -// and 4 (never use spaces) in Compact mode. -// -// 3. If there are no level 4 operators or no level 5 operators, then the -// cutoff is 6 (always use spaces) in Normal mode -// and 4 (never use spaces) in Compact mode. -func (p *printer) binaryExpr(x *ast.BinaryExpr, prec1, cutoff, depth int) { - prec := x.Op.Precedence() - if prec < prec1 { - // parenthesis needed - // Note: The parser inserts an ast.ParenExpr node; thus this case - // can only occur if the AST is created in a different way. - p.print(token.LPAREN) - p.expr0(x, reduceDepth(depth)) // parentheses undo one level of depth - p.print(token.RPAREN) - return - } - - printBlank := prec < cutoff - - ws := indent - p.expr1(x.X, prec, depth+diffPrec(x.X, prec)) - if printBlank { - p.print(blank) - } - xline := p.pos.Line // before the operator (it may be on the next line!) - yline := p.lineFor(x.Y.Pos()) - p.print(x.OpPos, x.Op) - if xline != yline && xline > 0 && yline > 0 { - // at least one line break, but respect an extra empty line - // in the source - if p.linebreak(yline, 1, ws, true) > 0 { - ws = ignore - printBlank = false // no blank after line break - } - } - if printBlank { - p.print(blank) - } - p.expr1(x.Y, prec+1, depth+1) - if ws == ignore { - p.print(unindent) - } -} - -func isBinary(expr ast.Expr) bool { - _, ok := expr.(*ast.BinaryExpr) - return ok -} - -func (p *printer) expr1(expr ast.Expr, prec1, depth int) { - p.print(expr.Pos()) - - switch x := expr.(type) { - case *ast.BadExpr: - p.print("BadExpr") - - case *ast.Ident: - p.print(x) - - case *ast.BinaryExpr: - if depth < 1 { - p.internalError("depth < 1:", depth) - depth = 1 - } - p.binaryExpr(x, prec1, cutoff(x, depth), depth) - - case *ast.KeyValueExpr: - p.expr(x.Key) - p.print(x.Colon, token.COLON, blank) - p.expr(x.Value) - - case *ast.StarExpr: - const prec = token.UnaryPrec - if prec < prec1 { - // parenthesis needed - p.print(token.LPAREN) - p.print(token.MUL) - p.expr(x.X) - p.print(token.RPAREN) - } else { - // no parenthesis needed - p.print(token.MUL) - p.expr(x.X) - } - - case *ast.UnaryExpr: - const prec = token.UnaryPrec - if prec < prec1 { - // parenthesis needed - p.print(token.LPAREN) - p.expr(x) - p.print(token.RPAREN) - } else { - // no parenthesis needed - p.print(x.Op) - if x.Op == token.RANGE { - // TODO(gri) Remove this code if it cannot be reached. - p.print(blank) - } - p.expr1(x.X, prec, depth) - } - - case *ast.BasicLit: - if p.Config.Mode&normalizeNumbers != 0 { - x = normalizedNumber(x) - } - p.print(x) - - case *ast.FuncLit: - p.print(x.Type.Pos(), token.FUNC) - // See the comment in funcDecl about how the header size is computed. - startCol := p.out.Column - len("func") - p.signature(x.Type) - p.funcBody(p.distanceFrom(x.Type.Pos(), startCol), blank, x.Body) - - case *ast.ParenExpr: - if _, hasParens := x.X.(*ast.ParenExpr); hasParens { - // don't print parentheses around an already parenthesized expression - // TODO(gri) consider making this more general and incorporate precedence levels - p.expr0(x.X, depth) - } else { - p.print(token.LPAREN) - p.expr0(x.X, reduceDepth(depth)) // parentheses undo one level of depth - p.print(x.Rparen, token.RPAREN) - } - - case *ast.SelectorExpr: - p.selectorExpr(x, depth, false) - - case *ast.TypeAssertExpr: - p.expr1(x.X, token.HighestPrec, depth) - p.print(token.PERIOD, x.Lparen, token.LPAREN) - if x.Type != nil { - p.expr(x.Type) - } else { - p.print(token.TYPE) - } - p.print(x.Rparen, token.RPAREN) - - case *ast.IndexExpr: - // TODO(gri): should treat[] like parentheses and undo one level of depth - p.expr1(x.X, token.HighestPrec, 1) - p.print(x.Lbrack, token.LBRACK) - p.expr0(x.Index, depth+1) - p.print(x.Rbrack, token.RBRACK) - - case *ast.IndexListExpr: - // TODO(gri): as for IndexExpr, should treat [] like parentheses and undo - // one level of depth - p.expr1(x.X, token.HighestPrec, 1) - p.print(x.Lbrack, token.LBRACK) - p.exprList(x.Lbrack, x.Indices, depth+1, commaTerm, x.Rbrack, false) - p.print(x.Rbrack, token.RBRACK) - - case *ast.SliceExpr: - // TODO(gri): should treat[] like parentheses and undo one level of depth - p.expr1(x.X, token.HighestPrec, 1) - p.print(x.Lbrack, token.LBRACK) - indices := []ast.Expr{x.Low, x.High} - if x.Max != nil { - indices = append(indices, x.Max) - } - // determine if we need extra blanks around ':' - var needsBlanks bool - if depth <= 1 { - var indexCount int - var hasBinaries bool - for _, x := range indices { - if x != nil { - indexCount++ - if isBinary(x) { - hasBinaries = true - } - } - } - if indexCount > 1 && hasBinaries { - needsBlanks = true - } - } - for i, x := range indices { - if i > 0 { - if indices[i-1] != nil && needsBlanks { - p.print(blank) - } - p.print(token.COLON) - if x != nil && needsBlanks { - p.print(blank) - } - } - if x != nil { - p.expr0(x, depth+1) - } - } - p.print(x.Rbrack, token.RBRACK) - - case *ast.CallExpr: - if len(x.Args) > 1 { - depth++ - } - var wasIndented bool - if _, ok := x.Fun.(*ast.FuncType); ok { - // conversions to literal function types require parentheses around the type - p.print(token.LPAREN) - wasIndented = p.possibleSelectorExpr(x.Fun, token.HighestPrec, depth) - p.print(token.RPAREN) - } else { - wasIndented = p.possibleSelectorExpr(x.Fun, token.HighestPrec, depth) - } - p.print(x.Lparen, token.LPAREN) - if x.Ellipsis.IsValid() { - p.exprList(x.Lparen, x.Args, depth, 0, x.Ellipsis, false) - p.print(x.Ellipsis, token.ELLIPSIS) - if x.Rparen.IsValid() && p.lineFor(x.Ellipsis) < p.lineFor(x.Rparen) { - p.print(token.COMMA, formfeed) - } - } else { - p.exprList(x.Lparen, x.Args, depth, commaTerm, x.Rparen, false) - } - p.print(x.Rparen, token.RPAREN) - if wasIndented { - p.print(unindent) - } - - case *ast.CompositeLit: - // composite literal elements that are composite literals themselves may have the type omitted - if x.Type != nil { - p.expr1(x.Type, token.HighestPrec, depth) - } - p.level++ - p.print(x.Lbrace, token.LBRACE) - p.exprList(x.Lbrace, x.Elts, 1, commaTerm, x.Rbrace, x.Incomplete) - // do not insert extra line break following a /*-style comment - // before the closing '}' as it might break the code if there - // is no trailing ',' - mode := noExtraLinebreak - // do not insert extra blank following a /*-style comment - // before the closing '}' unless the literal is empty - if len(x.Elts) > 0 { - mode |= noExtraBlank - } - // need the initial indent to print lone comments with - // the proper level of indentation - p.print(indent, unindent, mode, x.Rbrace, token.RBRACE, mode) - p.level-- - - case *ast.Ellipsis: - p.print(token.ELLIPSIS) - if x.Elt != nil { - p.expr(x.Elt) - } - - case *ast.ArrayType: - p.print(token.LBRACK) - if x.Len != nil { - p.expr(x.Len) - } - p.print(token.RBRACK) - p.expr(x.Elt) - - case *ast.StructType: - p.print(token.STRUCT) - p.fieldList(x.Fields, true, x.Incomplete) - - case *ast.FuncType: - p.print(token.FUNC) - p.signature(x) - - case *ast.InterfaceType: - p.print(token.INTERFACE) - p.fieldList(x.Methods, false, x.Incomplete) - - case *ast.MapType: - p.print(token.MAP, token.LBRACK) - p.expr(x.Key) - p.print(token.RBRACK) - p.expr(x.Value) - - case *ast.ChanType: - switch x.Dir { - case ast.SEND | ast.RECV: - p.print(token.CHAN) - case ast.RECV: - p.print(token.ARROW, token.CHAN) // x.Arrow and x.Pos() are the same - case ast.SEND: - p.print(token.CHAN, x.Arrow, token.ARROW) - } - p.print(blank) - p.expr(x.Value) - - default: - panic("unreachable") - } -} - -// normalizedNumber rewrites base prefixes and exponents -// of numbers to use lower-case letters (0X123 to 0x123 and 1.2E3 to 1.2e3), -// and removes leading 0's from integer imaginary literals (0765i to 765i). -// It leaves hexadecimal digits alone. -// -// normalizedNumber doesn't modify the ast.BasicLit value lit points to. -// If lit is not a number or a number in canonical format already, -// lit is returned as is. Otherwise a new ast.BasicLit is created. -func normalizedNumber(lit *ast.BasicLit) *ast.BasicLit { - if lit.Kind != token.INT && lit.Kind != token.FLOAT && lit.Kind != token.IMAG { - return lit // not a number - nothing to do - } - if len(lit.Value) < 2 { - return lit // only one digit (common case) - nothing to do - } - // len(lit.Value) >= 2 - - // We ignore lit.Kind because for lit.Kind == token.IMAG the literal may be an integer - // or floating-point value, decimal or not. Instead, just consider the literal pattern. - x := lit.Value - switch x[:2] { - default: - // 0-prefix octal, decimal int, or float (possibly with 'i' suffix) - if i := strings.LastIndexByte(x, 'E'); i >= 0 { - x = x[:i] + "e" + x[i+1:] - break - } - // remove leading 0's from integer (but not floating-point) imaginary literals - if x[len(x)-1] == 'i' && !strings.ContainsAny(x, ".e") { - x = strings.TrimLeft(x, "0_") - if x == "i" { - x = "0i" - } - } - case "0X": - x = "0x" + x[2:] - // possibly a hexadecimal float - if i := strings.LastIndexByte(x, 'P'); i >= 0 { - x = x[:i] + "p" + x[i+1:] - } - case "0x": - // possibly a hexadecimal float - i := strings.LastIndexByte(x, 'P') - if i == -1 { - return lit // nothing to do - } - x = x[:i] + "p" + x[i+1:] - case "0O": - x = "0o" + x[2:] - case "0o": - return lit // nothing to do - case "0B": - x = "0b" + x[2:] - case "0b": - return lit // nothing to do - } - - return &ast.BasicLit{ValuePos: lit.ValuePos, Kind: lit.Kind, Value: x} -} - -func (p *printer) possibleSelectorExpr(expr ast.Expr, prec1, depth int) bool { - if x, ok := expr.(*ast.SelectorExpr); ok { - return p.selectorExpr(x, depth, true) - } - p.expr1(expr, prec1, depth) - return false -} - -// selectorExpr handles an *ast.SelectorExpr node and reports whether x spans -// multiple lines. -func (p *printer) selectorExpr(x *ast.SelectorExpr, depth int, isMethod bool) bool { - p.expr1(x.X, token.HighestPrec, depth) - p.print(token.PERIOD) - if line := p.lineFor(x.Sel.Pos()); p.pos.IsValid() && p.pos.Line < line { - p.print(indent, newline, x.Sel.Pos(), x.Sel) - if !isMethod { - p.print(unindent) - } - return true - } - p.print(x.Sel.Pos(), x.Sel) - return false -} - -func (p *printer) expr0(x ast.Expr, depth int) { - p.expr1(x, token.LowestPrec, depth) -} - -func (p *printer) expr(x ast.Expr) { - const depth = 1 - p.expr1(x, token.LowestPrec, depth) -} - -// ---------------------------------------------------------------------------- -// Statements - -// Print the statement list indented, but without a newline after the last statement. -// Extra line breaks between statements in the source are respected but at most one -// empty line is printed between statements. -func (p *printer) stmtList(list []ast.Stmt, nindent int, nextIsRBrace bool) { - if nindent > 0 { - p.print(indent) - } - var line int - i := 0 - for _, s := range list { - // ignore empty statements (was issue 3466) - if _, isEmpty := s.(*ast.EmptyStmt); !isEmpty { - // nindent == 0 only for lists of switch/select case clauses; - // in those cases each clause is a new section - if len(p.output) > 0 { - // only print line break if we are not at the beginning of the output - // (i.e., we are not printing only a partial program) - p.linebreak(p.lineFor(s.Pos()), 1, ignore, i == 0 || nindent == 0 || p.linesFrom(line) > 0) - } - p.recordLine(&line) - p.stmt(s, nextIsRBrace && i == len(list)-1) - // labeled statements put labels on a separate line, but here - // we only care about the start line of the actual statement - // without label - correct line for each label - for t := s; ; { - lt, _ := t.(*ast.LabeledStmt) - if lt == nil { - break - } - line++ - t = lt.Stmt - } - i++ - } - } - if nindent > 0 { - p.print(unindent) - } -} - -// block prints an *ast.BlockStmt; it always spans at least two lines. -func (p *printer) block(b *ast.BlockStmt, nindent int) { - p.print(b.Lbrace, token.LBRACE) - p.stmtList(b.List, nindent, true) - p.linebreak(p.lineFor(b.Rbrace), 1, ignore, true) - p.print(b.Rbrace, token.RBRACE) -} - -func isTypeName(x ast.Expr) bool { - switch t := x.(type) { - case *ast.Ident: - return true - case *ast.SelectorExpr: - return isTypeName(t.X) - } - return false -} - -func stripParens(x ast.Expr) ast.Expr { - if px, strip := x.(*ast.ParenExpr); strip { - // parentheses must not be stripped if there are any - // unparenthesized composite literals starting with - // a type name - ast.Inspect(px.X, func(node ast.Node) bool { - switch x := node.(type) { - case *ast.ParenExpr: - // parentheses protect enclosed composite literals - return false - case *ast.CompositeLit: - if isTypeName(x.Type) { - strip = false // do not strip parentheses - } - return false - } - // in all other cases, keep inspecting - return true - }) - if strip { - return stripParens(px.X) - } - } - return x -} - -func stripParensAlways(x ast.Expr) ast.Expr { - if x, ok := x.(*ast.ParenExpr); ok { - return stripParensAlways(x.X) - } - return x -} - -func (p *printer) controlClause(isForStmt bool, init ast.Stmt, expr ast.Expr, post ast.Stmt) { - p.print(blank) - needsBlank := false - if init == nil && post == nil { - // no semicolons required - if expr != nil { - p.expr(stripParens(expr)) - needsBlank = true - } - } else { - // all semicolons required - // (they are not separators, print them explicitly) - if init != nil { - p.stmt(init, false) - } - p.print(token.SEMICOLON, blank) - if expr != nil { - p.expr(stripParens(expr)) - needsBlank = true - } - if isForStmt { - p.print(token.SEMICOLON, blank) - needsBlank = false - if post != nil { - p.stmt(post, false) - needsBlank = true - } - } - } - if needsBlank { - p.print(blank) - } -} - -// indentList reports whether an expression list would look better if it -// were indented wholesale (starting with the very first element, rather -// than starting at the first line break). -func (p *printer) indentList(list []ast.Expr) bool { - // Heuristic: indentList reports whether there are more than one multi- - // line element in the list, or if there is any element that is not - // starting on the same line as the previous one ends. - if len(list) >= 2 { - var b = p.lineFor(list[0].Pos()) - var e = p.lineFor(list[len(list)-1].End()) - if 0 < b && b < e { - // list spans multiple lines - n := 0 // multi-line element count - line := b - for _, x := range list { - xb := p.lineFor(x.Pos()) - xe := p.lineFor(x.End()) - if line < xb { - // x is not starting on the same - // line as the previous one ended - return true - } - if xb < xe { - // x is a multi-line element - n++ - } - line = xe - } - return n > 1 - } - } - return false -} - -func (p *printer) stmt(stmt ast.Stmt, nextIsRBrace bool) { - p.print(stmt.Pos()) - - switch s := stmt.(type) { - case *ast.BadStmt: - p.print("BadStmt") - - case *ast.DeclStmt: - p.decl(s.Decl) - - case *ast.EmptyStmt: - // nothing to do - - case *ast.LabeledStmt: - // a "correcting" unindent immediately following a line break - // is applied before the line break if there is no comment - // between (see writeWhitespace) - p.print(unindent) - p.expr(s.Label) - p.print(s.Colon, token.COLON, indent) - if e, isEmpty := s.Stmt.(*ast.EmptyStmt); isEmpty { - if !nextIsRBrace { - p.print(newline, e.Pos(), token.SEMICOLON) - break - } - } else { - p.linebreak(p.lineFor(s.Stmt.Pos()), 1, ignore, true) - } - p.stmt(s.Stmt, nextIsRBrace) - - case *ast.ExprStmt: - const depth = 1 - p.expr0(s.X, depth) - - case *ast.SendStmt: - const depth = 1 - p.expr0(s.Chan, depth) - p.print(blank, s.Arrow, token.ARROW, blank) - p.expr0(s.Value, depth) - - case *ast.IncDecStmt: - const depth = 1 - p.expr0(s.X, depth+1) - p.print(s.TokPos, s.Tok) - - case *ast.AssignStmt: - var depth = 1 - if len(s.Lhs) > 1 && len(s.Rhs) > 1 { - depth++ - } - p.exprList(s.Pos(), s.Lhs, depth, 0, s.TokPos, false) - p.print(blank, s.TokPos, s.Tok, blank) - p.exprList(s.TokPos, s.Rhs, depth, 0, token.NoPos, false) - - case *ast.GoStmt: - p.print(token.GO, blank) - p.expr(s.Call) - - case *ast.DeferStmt: - p.print(token.DEFER, blank) - p.expr(s.Call) - - case *ast.ReturnStmt: - p.print(token.RETURN) - if s.Results != nil { - p.print(blank) - // Use indentList heuristic to make corner cases look - // better (issue 1207). A more systematic approach would - // always indent, but this would cause significant - // reformatting of the code base and not necessarily - // lead to more nicely formatted code in general. - if p.indentList(s.Results) { - p.print(indent) - // Use NoPos so that a newline never goes before - // the results (see issue #32854). - p.exprList(token.NoPos, s.Results, 1, noIndent, token.NoPos, false) - p.print(unindent) - } else { - p.exprList(token.NoPos, s.Results, 1, 0, token.NoPos, false) - } - } - - case *ast.BranchStmt: - p.print(s.Tok) - if s.Label != nil { - p.print(blank) - p.expr(s.Label) - } - - case *ast.BlockStmt: - p.block(s, 1) - - case *ast.IfStmt: - p.print(token.IF) - p.controlClause(false, s.Init, s.Cond, nil) - p.block(s.Body, 1) - if s.Else != nil { - p.print(blank, token.ELSE, blank) - switch s.Else.(type) { - case *ast.BlockStmt, *ast.IfStmt: - p.stmt(s.Else, nextIsRBrace) - default: - // This can only happen with an incorrectly - // constructed AST. Permit it but print so - // that it can be parsed without errors. - p.print(token.LBRACE, indent, formfeed) - p.stmt(s.Else, true) - p.print(unindent, formfeed, token.RBRACE) - } - } - - case *ast.CaseClause: - if s.List != nil { - p.print(token.CASE, blank) - p.exprList(s.Pos(), s.List, 1, 0, s.Colon, false) - } else { - p.print(token.DEFAULT) - } - p.print(s.Colon, token.COLON) - p.stmtList(s.Body, 1, nextIsRBrace) - - case *ast.SwitchStmt: - p.print(token.SWITCH) - p.controlClause(false, s.Init, s.Tag, nil) - p.block(s.Body, 0) - - case *ast.TypeSwitchStmt: - p.print(token.SWITCH) - if s.Init != nil { - p.print(blank) - p.stmt(s.Init, false) - p.print(token.SEMICOLON) - } - p.print(blank) - p.stmt(s.Assign, false) - p.print(blank) - p.block(s.Body, 0) - - case *ast.CommClause: - if s.Comm != nil { - p.print(token.CASE, blank) - p.stmt(s.Comm, false) - } else { - p.print(token.DEFAULT) - } - p.print(s.Colon, token.COLON) - p.stmtList(s.Body, 1, nextIsRBrace) - - case *ast.SelectStmt: - p.print(token.SELECT, blank) - body := s.Body - if len(body.List) == 0 && !p.commentBefore(p.posFor(body.Rbrace)) { - // print empty select statement w/o comments on one line - p.print(body.Lbrace, token.LBRACE, body.Rbrace, token.RBRACE) - } else { - p.block(body, 0) - } - - case *ast.ForStmt: - p.print(token.FOR) - p.controlClause(true, s.Init, s.Cond, s.Post) - p.block(s.Body, 1) - - case *ast.RangeStmt: - p.print(token.FOR, blank) - if s.Key != nil { - p.expr(s.Key) - if s.Value != nil { - // use position of value following the comma as - // comma position for correct comment placement - p.print(s.Value.Pos(), token.COMMA, blank) - p.expr(s.Value) - } - p.print(blank, s.TokPos, s.Tok, blank) - } - p.print(token.RANGE, blank) - p.expr(stripParens(s.X)) - p.print(blank) - p.block(s.Body, 1) - - default: - panic("unreachable") - } -} - -// ---------------------------------------------------------------------------- -// Declarations - -// The keepTypeColumn function determines if the type column of a series of -// consecutive const or var declarations must be kept, or if initialization -// values (V) can be placed in the type column (T) instead. The i'th entry -// in the result slice is true if the type column in spec[i] must be kept. -// -// For example, the declaration: -// -// const ( -// foobar int = 42 // comment -// x = 7 // comment -// foo -// bar = 991 -// ) -// -// leads to the type/values matrix below. A run of value columns (V) can -// be moved into the type column if there is no type for any of the values -// in that column (we only move entire columns so that they align properly). -// -// matrix formatted result -// matrix -// T V -> T V -> true there is a T and so the type -// - V - V true column must be kept -// - - - - false -// - V V - false V is moved into T column -func keepTypeColumn(specs []ast.Spec) []bool { - m := make([]bool, len(specs)) - - populate := func(i, j int, keepType bool) { - if keepType { - for ; i < j; i++ { - m[i] = true - } - } - } - - i0 := -1 // if i0 >= 0 we are in a run and i0 is the start of the run - var keepType bool - for i, s := range specs { - t := s.(*ast.ValueSpec) - if t.Values != nil { - if i0 < 0 { - // start of a run of ValueSpecs with non-nil Values - i0 = i - keepType = false - } - } else { - if i0 >= 0 { - // end of a run - populate(i0, i, keepType) - i0 = -1 - } - } - if t.Type != nil { - keepType = true - } - } - if i0 >= 0 { - // end of a run - populate(i0, len(specs), keepType) - } - - return m -} - -func (p *printer) valueSpec(s *ast.ValueSpec, keepType bool) { - p.setComment(s.Doc) - p.identList(s.Names, false) // always present - extraTabs := 3 - if s.Type != nil || keepType { - p.print(vtab) - extraTabs-- - } - if s.Type != nil { - p.expr(s.Type) - } - if s.Values != nil { - p.print(vtab, token.ASSIGN, blank) - p.exprList(token.NoPos, s.Values, 1, 0, token.NoPos, false) - extraTabs-- - } - if s.Comment != nil { - for ; extraTabs > 0; extraTabs-- { - p.print(vtab) - } - p.setComment(s.Comment) - } -} - -func sanitizeImportPath(lit *ast.BasicLit) *ast.BasicLit { - // Note: An unmodified AST generated by go/parser will already - // contain a backward- or double-quoted path string that does - // not contain any invalid characters, and most of the work - // here is not needed. However, a modified or generated AST - // may possibly contain non-canonical paths. Do the work in - // all cases since it's not too hard and not speed-critical. - - // if we don't have a proper string, be conservative and return whatever we have - if lit.Kind != token.STRING { - return lit - } - s, err := strconv.Unquote(lit.Value) - if err != nil { - return lit - } - - // if the string is an invalid path, return whatever we have - // - // spec: "Implementation restriction: A compiler may restrict - // ImportPaths to non-empty strings using only characters belonging - // to Unicode's L, M, N, P, and S general categories (the Graphic - // characters without spaces) and may also exclude the characters - // !"#$%&'()*,:;<=>?[\]^`{|} and the Unicode replacement character - // U+FFFD." - if s == "" { - return lit - } - const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD" - for _, r := range s { - if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) { - return lit - } - } - - // otherwise, return the double-quoted path - s = strconv.Quote(s) - if s == lit.Value { - return lit // nothing wrong with lit - } - return &ast.BasicLit{ValuePos: lit.ValuePos, Kind: token.STRING, Value: s} -} - -// The parameter n is the number of specs in the group. If doIndent is set, -// multi-line identifier lists in the spec are indented when the first -// linebreak is encountered. -func (p *printer) spec(spec ast.Spec, n int, doIndent bool) { - switch s := spec.(type) { - case *ast.ImportSpec: - p.setComment(s.Doc) - if s.Name != nil { - p.expr(s.Name) - p.print(blank) - } - p.expr(sanitizeImportPath(s.Path)) - p.setComment(s.Comment) - p.print(s.EndPos) - - case *ast.ValueSpec: - if n != 1 { - p.internalError("expected n = 1; got", n) - } - p.setComment(s.Doc) - p.identList(s.Names, doIndent) // always present - if s.Type != nil { - p.print(blank) - p.expr(s.Type) - } - if s.Values != nil { - p.print(blank, token.ASSIGN, blank) - p.exprList(token.NoPos, s.Values, 1, 0, token.NoPos, false) - } - p.setComment(s.Comment) - - case *ast.TypeSpec: - p.setComment(s.Doc) - p.expr(s.Name) - if s.TypeParams != nil { - p.parameters(s.TypeParams, typeTParam) - } - if n == 1 { - p.print(blank) - } else { - p.print(vtab) - } - if s.Assign.IsValid() { - p.print(token.ASSIGN, blank) - } - p.expr(s.Type) - p.setComment(s.Comment) - - default: - panic("unreachable") - } -} - -func (p *printer) genDecl(d *ast.GenDecl) { - p.setComment(d.Doc) - p.print(d.Pos(), d.Tok, blank) - - if d.Lparen.IsValid() || len(d.Specs) > 1 { - // group of parenthesized declarations - p.print(d.Lparen, token.LPAREN) - if n := len(d.Specs); n > 0 { - p.print(indent, formfeed) - if n > 1 && (d.Tok == token.CONST || d.Tok == token.VAR) { - // two or more grouped const/var declarations: - // determine if the type column must be kept - keepType := keepTypeColumn(d.Specs) - var line int - for i, s := range d.Specs { - if i > 0 { - p.linebreak(p.lineFor(s.Pos()), 1, ignore, p.linesFrom(line) > 0) - } - p.recordLine(&line) - p.valueSpec(s.(*ast.ValueSpec), keepType[i]) - } - } else { - var line int - for i, s := range d.Specs { - if i > 0 { - p.linebreak(p.lineFor(s.Pos()), 1, ignore, p.linesFrom(line) > 0) - } - p.recordLine(&line) - p.spec(s, n, false) - } - } - p.print(unindent, formfeed) - } - p.print(d.Rparen, token.RPAREN) - - } else if len(d.Specs) > 0 { - // single declaration - p.spec(d.Specs[0], 1, true) - } -} - -// nodeSize determines the size of n in chars after formatting. -// The result is <= maxSize if the node fits on one line with at -// most maxSize chars and the formatted output doesn't contain -// any control chars. Otherwise, the result is > maxSize. -func (p *printer) nodeSize(n ast.Node, maxSize int) (size int) { - // nodeSize invokes the printer, which may invoke nodeSize - // recursively. For deep composite literal nests, this can - // lead to an exponential algorithm. Remember previous - // results to prune the recursion (was issue 1628). - if size, found := p.nodeSizes[n]; found { - return size - } - - size = maxSize + 1 // assume n doesn't fit - p.nodeSizes[n] = size - - // nodeSize computation must be independent of particular - // style so that we always get the same decision; print - // in RawFormat - cfg := Config{Mode: RawFormat} - var buf bytes.Buffer - if err := cfg.fprint(&buf, p.fset, n, p.nodeSizes); err != nil { - return - } - if buf.Len() <= maxSize { - for _, ch := range buf.Bytes() { - switch ch { - case '\n', '\f': - return // does not fit in a single line - } - } - size = buf.Len() // n fits - p.nodeSizes[n] = size - } - return -} - -// numLines returns the number of lines spanned by node n in the original source. -func (p *printer) numLines(n ast.Node) int { - if from := n.Pos(); from.IsValid() { - if to := n.End(); to.IsValid() { - return p.lineFor(to) - p.lineFor(from) + 1 - } - } - return infinity -} - -// bodySize is like nodeSize but it is specialized for *ast.BlockStmt's. -func (p *printer) bodySize(b *ast.BlockStmt, maxSize int) int { - pos1 := b.Pos() - pos2 := b.Rbrace - if pos1.IsValid() && pos2.IsValid() && p.lineFor(pos1) != p.lineFor(pos2) { - // opening and closing brace are on different lines - don't make it a one-liner - return maxSize + 1 - } - if len(b.List) > 5 { - // too many statements - don't make it a one-liner - return maxSize + 1 - } - // otherwise, estimate body size - bodySize := p.commentSizeBefore(p.posFor(pos2)) - for i, s := range b.List { - if bodySize > maxSize { - break // no need to continue - } - if i > 0 { - bodySize += 2 // space for a semicolon and blank - } - bodySize += p.nodeSize(s, maxSize) - } - return bodySize -} - -// funcBody prints a function body following a function header of given headerSize. -// If the header's and block's size are "small enough" and the block is "simple enough", -// the block is printed on the current line, without line breaks, spaced from the header -// by sep. Otherwise the block's opening "{" is printed on the current line, followed by -// lines for the block's statements and its closing "}". -func (p *printer) funcBody(headerSize int, sep whiteSpace, b *ast.BlockStmt) { - if b == nil { - return - } - - // save/restore composite literal nesting level - defer func(level int) { - p.level = level - }(p.level) - p.level = 0 - - const maxSize = 100 - if headerSize+p.bodySize(b, maxSize) <= maxSize { - p.print(sep, b.Lbrace, token.LBRACE) - if len(b.List) > 0 { - p.print(blank) - for i, s := range b.List { - if i > 0 { - p.print(token.SEMICOLON, blank) - } - p.stmt(s, i == len(b.List)-1) - } - p.print(blank) - } - p.print(noExtraLinebreak, b.Rbrace, token.RBRACE, noExtraLinebreak) - return - } - - if sep != ignore { - p.print(blank) // always use blank - } - p.block(b, 1) -} - -// distanceFrom returns the column difference between p.out (the current output -// position) and startOutCol. If the start position is on a different line from -// the current position (or either is unknown), the result is infinity. -func (p *printer) distanceFrom(startPos token.Pos, startOutCol int) int { - if startPos.IsValid() && p.pos.IsValid() && p.posFor(startPos).Line == p.pos.Line { - return p.out.Column - startOutCol - } - return infinity -} - -func (p *printer) funcDecl(d *ast.FuncDecl) { - p.setComment(d.Doc) - p.print(d.Pos(), token.FUNC, blank) - // We have to save startCol only after emitting FUNC; otherwise it can be on a - // different line (all whitespace preceding the FUNC is emitted only when the - // FUNC is emitted). - startCol := p.out.Column - len("func ") - if d.Recv != nil { - p.parameters(d.Recv, funcParam) // method: print receiver - p.print(blank) - } - p.expr(d.Name) - p.signature(d.Type) - p.funcBody(p.distanceFrom(d.Pos(), startCol), vtab, d.Body) -} - -func (p *printer) decl(decl ast.Decl) { - switch d := decl.(type) { - case *ast.BadDecl: - p.print(d.Pos(), "BadDecl") - case *ast.GenDecl: - p.genDecl(d) - case *ast.FuncDecl: - p.funcDecl(d) - default: - panic("unreachable") - } -} - -// ---------------------------------------------------------------------------- -// Files - -func declToken(decl ast.Decl) (tok token.Token) { - tok = token.ILLEGAL - switch d := decl.(type) { - case *ast.GenDecl: - tok = d.Tok - case *ast.FuncDecl: - tok = token.FUNC - } - return -} - -func (p *printer) declList(list []ast.Decl) { - tok := token.ILLEGAL - for _, d := range list { - prev := tok - tok = declToken(d) - // If the declaration token changed (e.g., from CONST to TYPE) - // or the next declaration has documentation associated with it, - // print an empty line between top-level declarations. - // (because p.linebreak is called with the position of d, which - // is past any documentation, the minimum requirement is satisfied - // even w/o the extra getDoc(d) nil-check - leave it in case the - // linebreak logic improves - there's already a TODO). - if len(p.output) > 0 { - // only print line break if we are not at the beginning of the output - // (i.e., we are not printing only a partial program) - min := 1 - if prev != tok || getDoc(d) != nil { - min = 2 - } - // start a new section if the next declaration is a function - // that spans multiple lines (see also issue #19544) - p.linebreak(p.lineFor(d.Pos()), min, ignore, tok == token.FUNC && p.numLines(d) > 1) - } - p.decl(d) - } -} - -func (p *printer) file(src *ast.File) { - p.setComment(src.Doc) - p.print(src.Pos(), token.PACKAGE, blank) - p.expr(src.Name) - p.declList(src.Decls) - p.print(newline) -} diff --git a/internal/backport/go/printer/performance_test.go b/internal/backport/go/printer/performance_test.go deleted file mode 100644 index bc8b17b382..0000000000 --- a/internal/backport/go/printer/performance_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements a simple printer performance benchmark: -// go test -bench=BenchmarkPrint - -package printer - -import ( - "bytes" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "io" - "log" - "os" - "testing" -) - -var ( - testfile *ast.File - testsize int64 -) - -func testprint(out io.Writer, file *ast.File) { - if err := (&Config{TabIndent | UseSpaces | normalizeNumbers, 8, 0}).Fprint(out, fset, file); err != nil { - log.Fatalf("print error: %s", err) - } -} - -// cannot initialize in init because (printer) Fprint launches goroutines. -func initialize() { - const filename = "testdata/parser.go" - - src, err := os.ReadFile(filename) - if err != nil { - log.Fatalf("%s", err) - } - - file, err := parser.ParseFile(fset, filename, src, parser.ParseComments) - if err != nil { - log.Fatalf("%s", err) - } - - var buf bytes.Buffer - testprint(&buf, file) - if !bytes.Equal(buf.Bytes(), src) { - log.Fatalf("print error: %s not idempotent", filename) - } - - testfile = file - testsize = int64(len(src)) -} - -func BenchmarkPrint(b *testing.B) { - if testfile == nil { - initialize() - } - b.ReportAllocs() - b.SetBytes(testsize) - for i := 0; i < b.N; i++ { - testprint(io.Discard, testfile) - } -} diff --git a/internal/backport/go/printer/printer.go b/internal/backport/go/printer/printer.go deleted file mode 100644 index 0ab4b96a91..0000000000 --- a/internal/backport/go/printer/printer.go +++ /dev/null @@ -1,1409 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package printer implements printing of AST nodes. -package printer - -import ( - "fmt" - "go/build/constraint" - "io" - "os" - "strings" - "text/tabwriter" - "unicode" - - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/token" -) - -const ( - maxNewlines = 2 // max. number of newlines between source text - debug = false // enable for debugging - infinity = 1 << 30 -) - -type whiteSpace byte - -const ( - ignore = whiteSpace(0) - blank = whiteSpace(' ') - vtab = whiteSpace('\v') - newline = whiteSpace('\n') - formfeed = whiteSpace('\f') - indent = whiteSpace('>') - unindent = whiteSpace('<') -) - -// A pmode value represents the current printer mode. -type pmode int - -const ( - noExtraBlank pmode = 1 << iota // disables extra blank after /*-style comment - noExtraLinebreak // disables extra line break after /*-style comment -) - -type commentInfo struct { - cindex int // current comment index - comment *ast.CommentGroup // = printer.comments[cindex]; or nil - commentOffset int // = printer.posFor(printer.comments[cindex].List[0].Pos()).Offset; or infinity - commentNewline bool // true if the comment group contains newlines -} - -type printer struct { - // Configuration (does not change after initialization) - Config - fset *token.FileSet - - // Current state - output []byte // raw printer result - indent int // current indentation - level int // level == 0: outside composite literal; level > 0: inside composite literal - mode pmode // current printer mode - endAlignment bool // if set, terminate alignment immediately - impliedSemi bool // if set, a linebreak implies a semicolon - lastTok token.Token // last token printed (token.ILLEGAL if it's whitespace) - prevOpen token.Token // previous non-brace "open" token (, [, or token.ILLEGAL - wsbuf []whiteSpace // delayed white space - goBuild []int // start index of all //go:build comments in output - plusBuild []int // start index of all // +build comments in output - - // Positions - // The out position differs from the pos position when the result - // formatting differs from the source formatting (in the amount of - // white space). If there's a difference and SourcePos is set in - // ConfigMode, //line directives are used in the output to restore - // original source positions for a reader. - pos token.Position // current position in AST (source) space - out token.Position // current position in output space - last token.Position // value of pos after calling writeString - linePtr *int // if set, record out.Line for the next token in *linePtr - - // The list of all source comments, in order of appearance. - comments []*ast.CommentGroup // may be nil - useNodeComments bool // if not set, ignore lead and line comments of nodes - - // Information about p.comments[p.cindex]; set up by nextComment. - commentInfo - - // Cache of already computed node sizes. - nodeSizes map[ast.Node]int - - // Cache of most recently computed line position. - cachedPos token.Pos - cachedLine int // line corresponding to cachedPos -} - -func (p *printer) init(cfg *Config, fset *token.FileSet, nodeSizes map[ast.Node]int) { - p.Config = *cfg - p.fset = fset - p.pos = token.Position{Line: 1, Column: 1} - p.out = token.Position{Line: 1, Column: 1} - p.wsbuf = make([]whiteSpace, 0, 16) // whitespace sequences are short - p.nodeSizes = nodeSizes - p.cachedPos = -1 -} - -func (p *printer) internalError(msg ...interface{}) { - if debug { - fmt.Print(p.pos.String() + ": ") - fmt.Println(msg...) - panic("golang.org/x/website/internal/backport/go/printer") - } -} - -// commentsHaveNewline reports whether a list of comments belonging to -// an *ast.CommentGroup contains newlines. Because the position information -// may only be partially correct, we also have to read the comment text. -func (p *printer) commentsHaveNewline(list []*ast.Comment) bool { - // len(list) > 0 - line := p.lineFor(list[0].Pos()) - for i, c := range list { - if i > 0 && p.lineFor(list[i].Pos()) != line { - // not all comments on the same line - return true - } - if t := c.Text; len(t) >= 2 && (t[1] == '/' || strings.Contains(t, "\n")) { - return true - } - } - _ = line - return false -} - -func (p *printer) nextComment() { - for p.cindex < len(p.comments) { - c := p.comments[p.cindex] - p.cindex++ - if list := c.List; len(list) > 0 { - p.comment = c - p.commentOffset = p.posFor(list[0].Pos()).Offset - p.commentNewline = p.commentsHaveNewline(list) - return - } - // we should not reach here (correct ASTs don't have empty - // ast.CommentGroup nodes), but be conservative and try again - } - // no more comments - p.commentOffset = infinity -} - -// commentBefore reports whether the current comment group occurs -// before the next position in the source code and printing it does -// not introduce implicit semicolons. -func (p *printer) commentBefore(next token.Position) bool { - return p.commentOffset < next.Offset && (!p.impliedSemi || !p.commentNewline) -} - -// commentSizeBefore returns the estimated size of the -// comments on the same line before the next position. -func (p *printer) commentSizeBefore(next token.Position) int { - // save/restore current p.commentInfo (p.nextComment() modifies it) - defer func(info commentInfo) { - p.commentInfo = info - }(p.commentInfo) - - size := 0 - for p.commentBefore(next) { - for _, c := range p.comment.List { - size += len(c.Text) - } - p.nextComment() - } - return size -} - -// recordLine records the output line number for the next non-whitespace -// token in *linePtr. It is used to compute an accurate line number for a -// formatted construct, independent of pending (not yet emitted) whitespace -// or comments. -func (p *printer) recordLine(linePtr *int) { - p.linePtr = linePtr -} - -// linesFrom returns the number of output lines between the current -// output line and the line argument, ignoring any pending (not yet -// emitted) whitespace or comments. It is used to compute an accurate -// size (in number of lines) for a formatted construct. -func (p *printer) linesFrom(line int) int { - return p.out.Line - line -} - -func (p *printer) posFor(pos token.Pos) token.Position { - // not used frequently enough to cache entire token.Position - return p.fset.PositionFor(pos, false /* absolute position */) -} - -func (p *printer) lineFor(pos token.Pos) int { - if pos != p.cachedPos { - p.cachedPos = pos - p.cachedLine = p.fset.PositionFor(pos, false /* absolute position */).Line - } - return p.cachedLine -} - -// writeLineDirective writes a //line directive if necessary. -func (p *printer) writeLineDirective(pos token.Position) { - if pos.IsValid() && (p.out.Line != pos.Line || p.out.Filename != pos.Filename) { - p.output = append(p.output, tabwriter.Escape) // protect '\n' in //line from tabwriter interpretation - p.output = append(p.output, fmt.Sprintf("//line %s:%d\n", pos.Filename, pos.Line)...) - p.output = append(p.output, tabwriter.Escape) - // p.out must match the //line directive - p.out.Filename = pos.Filename - p.out.Line = pos.Line - } -} - -// writeIndent writes indentation. -func (p *printer) writeIndent() { - // use "hard" htabs - indentation columns - // must not be discarded by the tabwriter - n := p.Config.Indent + p.indent // include base indentation - for i := 0; i < n; i++ { - p.output = append(p.output, '\t') - } - - // update positions - p.pos.Offset += n - p.pos.Column += n - p.out.Column += n -} - -// writeByte writes ch n times to p.output and updates p.pos. -// Only used to write formatting (white space) characters. -func (p *printer) writeByte(ch byte, n int) { - if p.endAlignment { - // Ignore any alignment control character; - // and at the end of the line, break with - // a formfeed to indicate termination of - // existing columns. - switch ch { - case '\t', '\v': - ch = ' ' - case '\n', '\f': - ch = '\f' - p.endAlignment = false - } - } - - if p.out.Column == 1 { - // no need to write line directives before white space - p.writeIndent() - } - - for i := 0; i < n; i++ { - p.output = append(p.output, ch) - } - - // update positions - p.pos.Offset += n - if ch == '\n' || ch == '\f' { - p.pos.Line += n - p.out.Line += n - p.pos.Column = 1 - p.out.Column = 1 - return - } - p.pos.Column += n - p.out.Column += n -} - -// writeString writes the string s to p.output and updates p.pos, p.out, -// and p.last. If isLit is set, s is escaped w/ tabwriter.Escape characters -// to protect s from being interpreted by the tabwriter. -// -// Note: writeString is only used to write Go tokens, literals, and -// comments, all of which must be written literally. Thus, it is correct -// to always set isLit = true. However, setting it explicitly only when -// needed (i.e., when we don't know that s contains no tabs or line breaks) -// avoids processing extra escape characters and reduces run time of the -// printer benchmark by up to 10%. -func (p *printer) writeString(pos token.Position, s string, isLit bool) { - if p.out.Column == 1 { - if p.Config.Mode&SourcePos != 0 { - p.writeLineDirective(pos) - } - p.writeIndent() - } - - if pos.IsValid() { - // update p.pos (if pos is invalid, continue with existing p.pos) - // Note: Must do this after handling line beginnings because - // writeIndent updates p.pos if there's indentation, but p.pos - // is the position of s. - p.pos = pos - } - - if isLit { - // Protect s such that is passes through the tabwriter - // unchanged. Note that valid Go programs cannot contain - // tabwriter.Escape bytes since they do not appear in legal - // UTF-8 sequences. - p.output = append(p.output, tabwriter.Escape) - } - - if debug { - p.output = append(p.output, fmt.Sprintf("/*%s*/", pos)...) // do not update p.pos! - } - p.output = append(p.output, s...) - - // update positions - nlines := 0 - var li int // index of last newline; valid if nlines > 0 - for i := 0; i < len(s); i++ { - // Raw string literals may contain any character except back quote (`). - if ch := s[i]; ch == '\n' || ch == '\f' { - // account for line break - nlines++ - li = i - // A line break inside a literal will break whatever column - // formatting is in place; ignore any further alignment through - // the end of the line. - p.endAlignment = true - } - } - p.pos.Offset += len(s) - if nlines > 0 { - p.pos.Line += nlines - p.out.Line += nlines - c := len(s) - li - p.pos.Column = c - p.out.Column = c - } else { - p.pos.Column += len(s) - p.out.Column += len(s) - } - - if isLit { - p.output = append(p.output, tabwriter.Escape) - } - - p.last = p.pos -} - -// writeCommentPrefix writes the whitespace before a comment. -// If there is any pending whitespace, it consumes as much of -// it as is likely to help position the comment nicely. -// pos is the comment position, next the position of the item -// after all pending comments, prev is the previous comment in -// a group of comments (or nil), and tok is the next token. -func (p *printer) writeCommentPrefix(pos, next token.Position, prev *ast.Comment, tok token.Token) { - if len(p.output) == 0 { - // the comment is the first item to be printed - don't write any whitespace - return - } - - if pos.IsValid() && pos.Filename != p.last.Filename { - // comment in a different file - separate with newlines - p.writeByte('\f', maxNewlines) - return - } - - if pos.Line == p.last.Line && (prev == nil || prev.Text[1] != '/') { - // comment on the same line as last item: - // separate with at least one separator - hasSep := false - if prev == nil { - // first comment of a comment group - j := 0 - for i, ch := range p.wsbuf { - switch ch { - case blank: - // ignore any blanks before a comment - p.wsbuf[i] = ignore - continue - case vtab: - // respect existing tabs - important - // for proper formatting of commented structs - hasSep = true - continue - case indent: - // apply pending indentation - continue - } - j = i - break - } - p.writeWhitespace(j) - } - // make sure there is at least one separator - if !hasSep { - sep := byte('\t') - if pos.Line == next.Line { - // next item is on the same line as the comment - // (which must be a /*-style comment): separate - // with a blank instead of a tab - sep = ' ' - } - p.writeByte(sep, 1) - } - - } else { - // comment on a different line: - // separate with at least one line break - droppedLinebreak := false - j := 0 - for i, ch := range p.wsbuf { - switch ch { - case blank, vtab: - // ignore any horizontal whitespace before line breaks - p.wsbuf[i] = ignore - continue - case indent: - // apply pending indentation - continue - case unindent: - // if this is not the last unindent, apply it - // as it is (likely) belonging to the last - // construct (e.g., a multi-line expression list) - // and is not part of closing a block - if i+1 < len(p.wsbuf) && p.wsbuf[i+1] == unindent { - continue - } - // if the next token is not a closing }, apply the unindent - // if it appears that the comment is aligned with the - // token; otherwise assume the unindent is part of a - // closing block and stop (this scenario appears with - // comments before a case label where the comments - // apply to the next case instead of the current one) - if tok != token.RBRACE && pos.Column == next.Column { - continue - } - case newline, formfeed: - p.wsbuf[i] = ignore - droppedLinebreak = prev == nil // record only if first comment of a group - } - j = i - break - } - p.writeWhitespace(j) - - // determine number of linebreaks before the comment - n := 0 - if pos.IsValid() && p.last.IsValid() { - n = pos.Line - p.last.Line - if n < 0 { // should never happen - n = 0 - } - } - - // at the package scope level only (p.indent == 0), - // add an extra newline if we dropped one before: - // this preserves a blank line before documentation - // comments at the package scope level (issue 2570) - if p.indent == 0 && droppedLinebreak { - n++ - } - - // make sure there is at least one line break - // if the previous comment was a line comment - if n == 0 && prev != nil && prev.Text[1] == '/' { - n = 1 - } - - if n > 0 { - // use formfeeds to break columns before a comment; - // this is analogous to using formfeeds to separate - // individual lines of /*-style comments - p.writeByte('\f', nlimit(n)) - } - } -} - -// Returns true if s contains only white space -// (only tabs and blanks can appear in the printer's context). -func isBlank(s string) bool { - for i := 0; i < len(s); i++ { - if s[i] > ' ' { - return false - } - } - return true -} - -// commonPrefix returns the common prefix of a and b. -func commonPrefix(a, b string) string { - i := 0 - for i < len(a) && i < len(b) && a[i] == b[i] && (a[i] <= ' ' || a[i] == '*') { - i++ - } - return a[0:i] -} - -// trimRight returns s with trailing whitespace removed. -func trimRight(s string) string { - return strings.TrimRightFunc(s, unicode.IsSpace) -} - -// stripCommonPrefix removes a common prefix from /*-style comment lines (unless no -// comment line is indented, all but the first line have some form of space prefix). -// The prefix is computed using heuristics such that is likely that the comment -// contents are nicely laid out after re-printing each line using the printer's -// current indentation. -func stripCommonPrefix(lines []string) { - if len(lines) <= 1 { - return // at most one line - nothing to do - } - // len(lines) > 1 - - // The heuristic in this function tries to handle a few - // common patterns of /*-style comments: Comments where - // the opening /* and closing */ are aligned and the - // rest of the comment text is aligned and indented with - // blanks or tabs, cases with a vertical "line of stars" - // on the left, and cases where the closing */ is on the - // same line as the last comment text. - - // Compute maximum common white prefix of all but the first, - // last, and blank lines, and replace blank lines with empty - // lines (the first line starts with /* and has no prefix). - // In cases where only the first and last lines are not blank, - // such as two-line comments, or comments where all inner lines - // are blank, consider the last line for the prefix computation - // since otherwise the prefix would be empty. - // - // Note that the first and last line are never empty (they - // contain the opening /* and closing */ respectively) and - // thus they can be ignored by the blank line check. - prefix := "" - prefixSet := false - if len(lines) > 2 { - for i, line := range lines[1 : len(lines)-1] { - if isBlank(line) { - lines[1+i] = "" // range starts with lines[1] - } else { - if !prefixSet { - prefix = line - prefixSet = true - } - prefix = commonPrefix(prefix, line) - } - - } - } - // If we don't have a prefix yet, consider the last line. - if !prefixSet { - line := lines[len(lines)-1] - prefix = commonPrefix(line, line) - } - - /* - * Check for vertical "line of stars" and correct prefix accordingly. - */ - lineOfStars := false - if p, _, ok := stringsCut(prefix, "*"); ok { - // remove trailing blank from prefix so stars remain aligned - prefix = strings.TrimSuffix(p, " ") - lineOfStars = true - } else { - // No line of stars present. - // Determine the white space on the first line after the /* - // and before the beginning of the comment text, assume two - // blanks instead of the /* unless the first character after - // the /* is a tab. If the first comment line is empty but - // for the opening /*, assume up to 3 blanks or a tab. This - // whitespace may be found as suffix in the common prefix. - first := lines[0] - if isBlank(first[2:]) { - // no comment text on the first line: - // reduce prefix by up to 3 blanks or a tab - // if present - this keeps comment text indented - // relative to the /* and */'s if it was indented - // in the first place - i := len(prefix) - for n := 0; n < 3 && i > 0 && prefix[i-1] == ' '; n++ { - i-- - } - if i == len(prefix) && i > 0 && prefix[i-1] == '\t' { - i-- - } - prefix = prefix[0:i] - } else { - // comment text on the first line - suffix := make([]byte, len(first)) - n := 2 // start after opening /* - for n < len(first) && first[n] <= ' ' { - suffix[n] = first[n] - n++ - } - if n > 2 && suffix[2] == '\t' { - // assume the '\t' compensates for the /* - suffix = suffix[2:n] - } else { - // otherwise assume two blanks - suffix[0], suffix[1] = ' ', ' ' - suffix = suffix[0:n] - } - // Shorten the computed common prefix by the length of - // suffix, if it is found as suffix of the prefix. - prefix = strings.TrimSuffix(prefix, string(suffix)) - } - } - - // Handle last line: If it only contains a closing */, align it - // with the opening /*, otherwise align the text with the other - // lines. - last := lines[len(lines)-1] - closing := "*/" - before, _, _ := stringsCut(last, closing) // closing always present - if isBlank(before) { - // last line only contains closing */ - if lineOfStars { - closing = " */" // add blank to align final star - } - lines[len(lines)-1] = prefix + closing - } else { - // last line contains more comment text - assume - // it is aligned like the other lines and include - // in prefix computation - prefix = commonPrefix(prefix, last) - } - - // Remove the common prefix from all but the first and empty lines. - for i, line := range lines { - if i > 0 && line != "" { - lines[i] = line[len(prefix):] - } - } -} - -func (p *printer) writeComment(comment *ast.Comment) { - text := comment.Text - pos := p.posFor(comment.Pos()) - - const linePrefix = "//line " - if strings.HasPrefix(text, linePrefix) && (!pos.IsValid() || pos.Column == 1) { - // Possibly a //-style line directive. - // Suspend indentation temporarily to keep line directive valid. - defer func(indent int) { p.indent = indent }(p.indent) - p.indent = 0 - } - - // shortcut common case of //-style comments - if text[1] == '/' { - if constraint.IsGoBuild(text) { - p.goBuild = append(p.goBuild, len(p.output)) - } else if constraint.IsPlusBuild(text) { - p.plusBuild = append(p.plusBuild, len(p.output)) - } - p.writeString(pos, trimRight(text), true) - return - } - - // for /*-style comments, print line by line and let the - // write function take care of the proper indentation - lines := strings.Split(text, "\n") - - // The comment started in the first column but is going - // to be indented. For an idempotent result, add indentation - // to all lines such that they look like they were indented - // before - this will make sure the common prefix computation - // is the same independent of how many times formatting is - // applied (was issue 1835). - if pos.IsValid() && pos.Column == 1 && p.indent > 0 { - for i, line := range lines[1:] { - lines[1+i] = " " + line - } - } - - stripCommonPrefix(lines) - - // write comment lines, separated by formfeed, - // without a line break after the last line - for i, line := range lines { - if i > 0 { - p.writeByte('\f', 1) - pos = p.pos - } - if len(line) > 0 { - p.writeString(pos, trimRight(line), true) - } - } -} - -// writeCommentSuffix writes a line break after a comment if indicated -// and processes any leftover indentation information. If a line break -// is needed, the kind of break (newline vs formfeed) depends on the -// pending whitespace. The writeCommentSuffix result indicates if a -// newline was written or if a formfeed was dropped from the whitespace -// buffer. -func (p *printer) writeCommentSuffix(needsLinebreak bool) (wroteNewline, droppedFF bool) { - for i, ch := range p.wsbuf { - switch ch { - case blank, vtab: - // ignore trailing whitespace - p.wsbuf[i] = ignore - case indent, unindent: - // don't lose indentation information - case newline, formfeed: - // if we need a line break, keep exactly one - // but remember if we dropped any formfeeds - if needsLinebreak { - needsLinebreak = false - wroteNewline = true - } else { - if ch == formfeed { - droppedFF = true - } - p.wsbuf[i] = ignore - } - } - } - p.writeWhitespace(len(p.wsbuf)) - - // make sure we have a line break - if needsLinebreak { - p.writeByte('\n', 1) - wroteNewline = true - } - - return -} - -// containsLinebreak reports whether the whitespace buffer contains any line breaks. -func (p *printer) containsLinebreak() bool { - for _, ch := range p.wsbuf { - if ch == newline || ch == formfeed { - return true - } - } - return false -} - -// intersperseComments consumes all comments that appear before the next token -// tok and prints it together with the buffered whitespace (i.e., the whitespace -// that needs to be written before the next token). A heuristic is used to mix -// the comments and whitespace. The intersperseComments result indicates if a -// newline was written or if a formfeed was dropped from the whitespace buffer. -func (p *printer) intersperseComments(next token.Position, tok token.Token) (wroteNewline, droppedFF bool) { - var last *ast.Comment - for p.commentBefore(next) { - list := p.comment.List - changed := false - if p.lastTok != token.IMPORT && // do not rewrite cgo's import "C" comments - p.posFor(p.comment.Pos()).Column == 1 && - p.posFor(p.comment.End()+1) == next { - // Unindented comment abutting next token position: - // a top-level doc comment. - list = formatDocComment(list) - changed = true - - if len(p.comment.List) > 0 && len(list) == 0 { - // The doc comment was removed entirely. - // Keep preceding whitespace. - p.writeCommentPrefix(p.posFor(p.comment.Pos()), next, last, tok) - // Change print state to continue at next. - p.pos = next - p.last = next - // There can't be any more comments. - p.nextComment() - return p.writeCommentSuffix(false) - } - } - for _, c := range list { - p.writeCommentPrefix(p.posFor(c.Pos()), next, last, tok) - p.writeComment(c) - last = c - } - // In case list was rewritten, change print state to where - // the original list would have ended. - if len(p.comment.List) > 0 && changed { - last = p.comment.List[len(p.comment.List)-1] - p.pos = p.posFor(last.End()) - p.last = p.pos - } - p.nextComment() - } - - if last != nil { - // If the last comment is a /*-style comment and the next item - // follows on the same line but is not a comma, and not a "closing" - // token immediately following its corresponding "opening" token, - // add an extra separator unless explicitly disabled. Use a blank - // as separator unless we have pending linebreaks, they are not - // disabled, and we are outside a composite literal, in which case - // we want a linebreak (issue 15137). - // TODO(gri) This has become overly complicated. We should be able - // to track whether we're inside an expression or statement and - // use that information to decide more directly. - needsLinebreak := false - if p.mode&noExtraBlank == 0 && - last.Text[1] == '*' && p.lineFor(last.Pos()) == next.Line && - tok != token.COMMA && - (tok != token.RPAREN || p.prevOpen == token.LPAREN) && - (tok != token.RBRACK || p.prevOpen == token.LBRACK) { - if p.containsLinebreak() && p.mode&noExtraLinebreak == 0 && p.level == 0 { - needsLinebreak = true - } else { - p.writeByte(' ', 1) - } - } - // Ensure that there is a line break after a //-style comment, - // before EOF, and before a closing '}' unless explicitly disabled. - if last.Text[1] == '/' || - tok == token.EOF || - tok == token.RBRACE && p.mode&noExtraLinebreak == 0 { - needsLinebreak = true - } - return p.writeCommentSuffix(needsLinebreak) - } - - // no comment was written - we should never reach here since - // intersperseComments should not be called in that case - p.internalError("intersperseComments called without pending comments") - return -} - -// whiteWhitespace writes the first n whitespace entries. -func (p *printer) writeWhitespace(n int) { - // write entries - for i := 0; i < n; i++ { - switch ch := p.wsbuf[i]; ch { - case ignore: - // ignore! - case indent: - p.indent++ - case unindent: - p.indent-- - if p.indent < 0 { - p.internalError("negative indentation:", p.indent) - p.indent = 0 - } - case newline, formfeed: - // A line break immediately followed by a "correcting" - // unindent is swapped with the unindent - this permits - // proper label positioning. If a comment is between - // the line break and the label, the unindent is not - // part of the comment whitespace prefix and the comment - // will be positioned correctly indented. - if i+1 < n && p.wsbuf[i+1] == unindent { - // Use a formfeed to terminate the current section. - // Otherwise, a long label name on the next line leading - // to a wide column may increase the indentation column - // of lines before the label; effectively leading to wrong - // indentation. - p.wsbuf[i], p.wsbuf[i+1] = unindent, formfeed - i-- // do it again - continue - } - fallthrough - default: - p.writeByte(byte(ch), 1) - } - } - - // shift remaining entries down - l := copy(p.wsbuf, p.wsbuf[n:]) - p.wsbuf = p.wsbuf[:l] -} - -// ---------------------------------------------------------------------------- -// Printing interface - -// nlimit limits n to maxNewlines. -func nlimit(n int) int { - if n > maxNewlines { - n = maxNewlines - } - return n -} - -func mayCombine(prev token.Token, next byte) (b bool) { - switch prev { - case token.INT: - b = next == '.' // 1. - case token.ADD: - b = next == '+' // ++ - case token.SUB: - b = next == '-' // -- - case token.QUO: - b = next == '*' // /* - case token.LSS: - b = next == '-' || next == '<' // <- or << - case token.AND: - b = next == '&' || next == '^' // && or &^ - } - return -} - -// print prints a list of "items" (roughly corresponding to syntactic -// tokens, but also including whitespace and formatting information). -// It is the only print function that should be called directly from -// any of the AST printing functions in nodes.go. -// -// Whitespace is accumulated until a non-whitespace token appears. Any -// comments that need to appear before that token are printed first, -// taking into account the amount and structure of any pending white- -// space for best comment placement. Then, any leftover whitespace is -// printed, followed by the actual token. -func (p *printer) print(args ...interface{}) { - for _, arg := range args { - // information about the current arg - var data string - var isLit bool - var impliedSemi bool // value for p.impliedSemi after this arg - - // record previous opening token, if any - switch p.lastTok { - case token.ILLEGAL: - // ignore (white space) - case token.LPAREN, token.LBRACK: - p.prevOpen = p.lastTok - default: - // other tokens followed any opening token - p.prevOpen = token.ILLEGAL - } - - switch x := arg.(type) { - case pmode: - // toggle printer mode - p.mode ^= x - continue - - case whiteSpace: - if x == ignore { - // don't add ignore's to the buffer; they - // may screw up "correcting" unindents (see - // LabeledStmt) - continue - } - i := len(p.wsbuf) - if i == cap(p.wsbuf) { - // Whitespace sequences are very short so this should - // never happen. Handle gracefully (but possibly with - // bad comment placement) if it does happen. - p.writeWhitespace(i) - i = 0 - } - p.wsbuf = p.wsbuf[0 : i+1] - p.wsbuf[i] = x - if x == newline || x == formfeed { - // newlines affect the current state (p.impliedSemi) - // and not the state after printing arg (impliedSemi) - // because comments can be interspersed before the arg - // in this case - p.impliedSemi = false - } - p.lastTok = token.ILLEGAL - continue - - case *ast.Ident: - data = x.Name - impliedSemi = true - p.lastTok = token.IDENT - - case *ast.BasicLit: - data = x.Value - isLit = true - impliedSemi = true - p.lastTok = x.Kind - - case token.Token: - s := x.String() - if mayCombine(p.lastTok, s[0]) { - // the previous and the current token must be - // separated by a blank otherwise they combine - // into a different incorrect token sequence - // (except for token.INT followed by a '.' this - // should never happen because it is taken care - // of via binary expression formatting) - if len(p.wsbuf) != 0 { - p.internalError("whitespace buffer not empty") - } - p.wsbuf = p.wsbuf[0:1] - p.wsbuf[0] = ' ' - } - data = s - // some keywords followed by a newline imply a semicolon - switch x { - case token.BREAK, token.CONTINUE, token.FALLTHROUGH, token.RETURN, - token.INC, token.DEC, token.RPAREN, token.RBRACK, token.RBRACE: - impliedSemi = true - } - p.lastTok = x - - case token.Pos: - if x.IsValid() { - p.pos = p.posFor(x) // accurate position of next item - } - continue - - case string: - // incorrect AST - print error message - data = x - isLit = true - impliedSemi = true - p.lastTok = token.STRING - - default: - fmt.Fprintf(os.Stderr, "print: unsupported argument %v (%T)\n", arg, arg) - panic("go/printer type") - } - // data != "" - - next := p.pos // estimated/accurate position of next item - wroteNewline, droppedFF := p.flush(next, p.lastTok) - - // intersperse extra newlines if present in the source and - // if they don't cause extra semicolons (don't do this in - // flush as it will cause extra newlines at the end of a file) - if !p.impliedSemi { - n := nlimit(next.Line - p.pos.Line) - // don't exceed maxNewlines if we already wrote one - if wroteNewline && n == maxNewlines { - n = maxNewlines - 1 - } - if n > 0 { - ch := byte('\n') - if droppedFF { - ch = '\f' // use formfeed since we dropped one before - } - p.writeByte(ch, n) - impliedSemi = false - } - } - - // the next token starts now - record its line number if requested - if p.linePtr != nil { - *p.linePtr = p.out.Line - p.linePtr = nil - } - - p.writeString(next, data, isLit) - p.impliedSemi = impliedSemi - } -} - -// flush prints any pending comments and whitespace occurring textually -// before the position of the next token tok. The flush result indicates -// if a newline was written or if a formfeed was dropped from the whitespace -// buffer. -func (p *printer) flush(next token.Position, tok token.Token) (wroteNewline, droppedFF bool) { - if p.commentBefore(next) { - // if there are comments before the next item, intersperse them - wroteNewline, droppedFF = p.intersperseComments(next, tok) - } else { - // otherwise, write any leftover whitespace - p.writeWhitespace(len(p.wsbuf)) - } - return -} - -// getNode returns the ast.CommentGroup associated with n, if any. -func getDoc(n ast.Node) *ast.CommentGroup { - switch n := n.(type) { - case *ast.Field: - return n.Doc - case *ast.ImportSpec: - return n.Doc - case *ast.ValueSpec: - return n.Doc - case *ast.TypeSpec: - return n.Doc - case *ast.GenDecl: - return n.Doc - case *ast.FuncDecl: - return n.Doc - case *ast.File: - return n.Doc - } - return nil -} - -func getLastComment(n ast.Node) *ast.CommentGroup { - switch n := n.(type) { - case *ast.Field: - return n.Comment - case *ast.ImportSpec: - return n.Comment - case *ast.ValueSpec: - return n.Comment - case *ast.TypeSpec: - return n.Comment - case *ast.GenDecl: - if len(n.Specs) > 0 { - return getLastComment(n.Specs[len(n.Specs)-1]) - } - case *ast.File: - if len(n.Comments) > 0 { - return n.Comments[len(n.Comments)-1] - } - } - return nil -} - -func (p *printer) printNode(node interface{}) error { - // unpack *CommentedNode, if any - var comments []*ast.CommentGroup - if cnode, ok := node.(*CommentedNode); ok { - node = cnode.Node - comments = cnode.Comments - } - - if comments != nil { - // commented node - restrict comment list to relevant range - n, ok := node.(ast.Node) - if !ok { - goto unsupported - } - beg := n.Pos() - end := n.End() - // if the node has associated documentation, - // include that commentgroup in the range - // (the comment list is sorted in the order - // of the comment appearance in the source code) - if doc := getDoc(n); doc != nil { - beg = doc.Pos() - } - if com := getLastComment(n); com != nil { - if e := com.End(); e > end { - end = e - } - } - // token.Pos values are global offsets, we can - // compare them directly - i := 0 - for i < len(comments) && comments[i].End() < beg { - i++ - } - j := i - for j < len(comments) && comments[j].Pos() < end { - j++ - } - if i < j { - p.comments = comments[i:j] - } - } else if n, ok := node.(*ast.File); ok { - // use ast.File comments, if any - p.comments = n.Comments - } - - // if there are no comments, use node comments - p.useNodeComments = p.comments == nil - - // get comments ready for use - p.nextComment() - - p.print(pmode(0)) - - // format node - switch n := node.(type) { - case ast.Expr: - p.expr(n) - case ast.Stmt: - // A labeled statement will un-indent to position the label. - // Set p.indent to 1 so we don't get indent "underflow". - if _, ok := n.(*ast.LabeledStmt); ok { - p.indent = 1 - } - p.stmt(n, false) - case ast.Decl: - p.decl(n) - case ast.Spec: - p.spec(n, 1, false) - case []ast.Stmt: - // A labeled statement will un-indent to position the label. - // Set p.indent to 1 so we don't get indent "underflow". - for _, s := range n { - if _, ok := s.(*ast.LabeledStmt); ok { - p.indent = 1 - } - } - p.stmtList(n, 0, false) - case []ast.Decl: - p.declList(n) - case *ast.File: - p.file(n) - default: - goto unsupported - } - - return nil - -unsupported: - return fmt.Errorf("go/printer: unsupported node type %T", node) -} - -// ---------------------------------------------------------------------------- -// Trimmer - -// A trimmer is an io.Writer filter for stripping tabwriter.Escape -// characters, trailing blanks and tabs, and for converting formfeed -// and vtab characters into newlines and htabs (in case no tabwriter -// is used). Text bracketed by tabwriter.Escape characters is passed -// through unchanged. -type trimmer struct { - output io.Writer - state int - space []byte -} - -// trimmer is implemented as a state machine. -// It can be in one of the following states: -const ( - inSpace = iota // inside space - inEscape // inside text bracketed by tabwriter.Escapes - inText // inside text -) - -func (p *trimmer) resetSpace() { - p.state = inSpace - p.space = p.space[0:0] -} - -// Design note: It is tempting to eliminate extra blanks occurring in -// whitespace in this function as it could simplify some -// of the blanks logic in the node printing functions. -// However, this would mess up any formatting done by -// the tabwriter. - -var aNewline = []byte("\n") - -func (p *trimmer) Write(data []byte) (n int, err error) { - // invariants: - // p.state == inSpace: - // p.space is unwritten - // p.state == inEscape, inText: - // data[m:n] is unwritten - m := 0 - var b byte - for n, b = range data { - if b == '\v' { - b = '\t' // convert to htab - } - switch p.state { - case inSpace: - switch b { - case '\t', ' ': - p.space = append(p.space, b) - case '\n', '\f': - p.resetSpace() // discard trailing space - _, err = p.output.Write(aNewline) - case tabwriter.Escape: - _, err = p.output.Write(p.space) - p.state = inEscape - m = n + 1 // +1: skip tabwriter.Escape - default: - _, err = p.output.Write(p.space) - p.state = inText - m = n - } - case inEscape: - if b == tabwriter.Escape { - _, err = p.output.Write(data[m:n]) - p.resetSpace() - } - case inText: - switch b { - case '\t', ' ': - _, err = p.output.Write(data[m:n]) - p.resetSpace() - p.space = append(p.space, b) - case '\n', '\f': - _, err = p.output.Write(data[m:n]) - p.resetSpace() - if err == nil { - _, err = p.output.Write(aNewline) - } - case tabwriter.Escape: - _, err = p.output.Write(data[m:n]) - p.state = inEscape - m = n + 1 // +1: skip tabwriter.Escape - } - default: - panic("unreachable") - } - if err != nil { - return - } - } - n = len(data) - - switch p.state { - case inEscape, inText: - _, err = p.output.Write(data[m:n]) - p.resetSpace() - } - - return -} - -// ---------------------------------------------------------------------------- -// Public interface - -// A Mode value is a set of flags (or 0). They control printing. -type Mode uint - -const ( - RawFormat Mode = 1 << iota // do not use a tabwriter; if set, UseSpaces is ignored - TabIndent // use tabs for indentation independent of UseSpaces - UseSpaces // use spaces instead of tabs for alignment - SourcePos // emit //line directives to preserve original source positions -) - -// The mode below is not included in printer's public API because -// editing code text is deemed out of scope. Because this mode is -// unexported, it's also possible to modify or remove it based on -// the evolving needs of go/format and cmd/gofmt without breaking -// users. See discussion in CL 240683. -const ( - // normalizeNumbers means to canonicalize number - // literal prefixes and exponents while printing. - // - // This value is known in and used by go/format and cmd/gofmt. - // It is currently more convenient and performant for those - // packages to apply number normalization during printing, - // rather than by modifying the AST in advance. - normalizeNumbers Mode = 1 << 30 -) - -// A Config node controls the output of Fprint. -type Config struct { - Mode Mode // default: 0 - Tabwidth int // default: 8 - Indent int // default: 0 (all code is indented at least by this much) -} - -// fprint implements Fprint and takes a nodesSizes map for setting up the printer state. -func (cfg *Config) fprint(output io.Writer, fset *token.FileSet, node interface{}, nodeSizes map[ast.Node]int) (err error) { - // print node - var p printer - p.init(cfg, fset, nodeSizes) - if err = p.printNode(node); err != nil { - return - } - // print outstanding comments - p.impliedSemi = false // EOF acts like a newline - p.flush(token.Position{Offset: infinity, Line: infinity}, token.EOF) - - // output is buffered in p.output now. - // fix //go:build and // +build comments if needed. - p.fixGoBuildLines() - - // redirect output through a trimmer to eliminate trailing whitespace - // (Input to a tabwriter must be untrimmed since trailing tabs provide - // formatting information. The tabwriter could provide trimming - // functionality but no tabwriter is used when RawFormat is set.) - output = &trimmer{output: output} - - // redirect output through a tabwriter if necessary - if cfg.Mode&RawFormat == 0 { - minwidth := cfg.Tabwidth - - padchar := byte('\t') - if cfg.Mode&UseSpaces != 0 { - padchar = ' ' - } - - twmode := tabwriter.DiscardEmptyColumns - if cfg.Mode&TabIndent != 0 { - minwidth = 0 - twmode |= tabwriter.TabIndent - } - - output = tabwriter.NewWriter(output, minwidth, cfg.Tabwidth, 1, padchar, twmode) - } - - // write printer result via tabwriter/trimmer to output - if _, err = output.Write(p.output); err != nil { - return - } - - // flush tabwriter, if any - if tw, _ := output.(*tabwriter.Writer); tw != nil { - err = tw.Flush() - } - - return -} - -// A CommentedNode bundles an AST node and corresponding comments. -// It may be provided as argument to any of the Fprint functions. -type CommentedNode struct { - Node interface{} // *ast.File, or ast.Expr, ast.Decl, ast.Spec, or ast.Stmt - Comments []*ast.CommentGroup -} - -// Fprint "pretty-prints" an AST node to output for a given configuration cfg. -// Position information is interpreted relative to the file set fset. -// The node type must be *ast.File, *CommentedNode, []ast.Decl, []ast.Stmt, -// or assignment-compatible to ast.Expr, ast.Decl, ast.Spec, or ast.Stmt. -func (cfg *Config) Fprint(output io.Writer, fset *token.FileSet, node interface{}) error { - return cfg.fprint(output, fset, node, make(map[ast.Node]int)) -} - -// Fprint "pretty-prints" an AST node to output. -// It calls Config.Fprint with default settings. -// Note that gofmt uses tabs for indentation but spaces for alignment; -// use format.Node (package go/format) for output that matches gofmt. -func Fprint(output io.Writer, fset *token.FileSet, node interface{}) error { - return (&Config{Tabwidth: 8}).Fprint(output, fset, node) -} - -func stringsCut(s, sep string) (before, after string, found bool) { - if i := strings.Index(s, sep); i >= 0 { - return s[:i], s[i+len(sep):], true - } - return s, "", false -} diff --git a/internal/backport/go/printer/printer_test.go b/internal/backport/go/printer/printer_test.go deleted file mode 100644 index 9347d6b629..0000000000 --- a/internal/backport/go/printer/printer_test.go +++ /dev/null @@ -1,800 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package printer - -import ( - "bytes" - "errors" - "flag" - "fmt" - "io" - "os" - "path/filepath" - "testing" - "time" - - "golang.org/x/website/internal/backport/diff" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -const ( - dataDir = "testdata" - tabwidth = 8 -) - -var update = flag.Bool("update", false, "update golden files") - -var fset = token.NewFileSet() - -type checkMode uint - -const ( - export checkMode = 1 << iota - rawFormat - normNumber - idempotent - allowTypeParams -) - -// format parses src, prints the corresponding AST, verifies the resulting -// src is syntactically correct, and returns the resulting src or an error -// if any. -func format(src []byte, mode checkMode) ([]byte, error) { - // parse src - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - return nil, fmt.Errorf("parse: %s\n%s", err, src) - } - - // filter exports if necessary - if mode&export != 0 { - ast.FileExports(f) // ignore result - f.Comments = nil // don't print comments that are not in AST - } - - // determine printer configuration - cfg := Config{Tabwidth: tabwidth} - if mode&rawFormat != 0 { - cfg.Mode |= RawFormat - } - if mode&normNumber != 0 { - cfg.Mode |= normalizeNumbers - } - - // print AST - var buf bytes.Buffer - if err := cfg.Fprint(&buf, fset, f); err != nil { - return nil, fmt.Errorf("print: %s", err) - } - - // make sure formatted output is syntactically correct - res := buf.Bytes() - if _, err := parser.ParseFile(fset, "", res, parser.ParseComments); err != nil { - return nil, fmt.Errorf("re-parse: %s\n%s", err, buf.Bytes()) - } - - return res, nil -} - -// lineAt returns the line in text starting at offset offs. -func lineAt(text []byte, offs int) []byte { - i := offs - for i < len(text) && text[i] != '\n' { - i++ - } - return text[offs:i] -} - -// checkEqual compares a and b. -func checkEqual(aname, bname string, a, b []byte) error { - if bytes.Equal(a, b) { - return nil - } - return errors.New(string(diff.Diff(aname, a, bname, b))) -} - -func runcheck(t *testing.T, source, golden string, mode checkMode) { - src, err := os.ReadFile(source) - if err != nil { - t.Error(err) - return - } - - res, err := format(src, mode) - if err != nil { - t.Error(err) - return - } - - // update golden files if necessary - if *update { - if err := os.WriteFile(golden, res, 0644); err != nil { - t.Error(err) - } - return - } - - // get golden - gld, err := os.ReadFile(golden) - if err != nil { - t.Error(err) - return - } - - // formatted source and golden must be the same - if err := checkEqual(source, golden, res, gld); err != nil { - t.Error(err) - return - } - - if mode&idempotent != 0 { - // formatting golden must be idempotent - // (This is very difficult to achieve in general and for now - // it is only checked for files explicitly marked as such.) - res, err = format(gld, mode) - if err != nil { - t.Error(err) - return - } - if err := checkEqual(golden, fmt.Sprintf("format(%s)", golden), gld, res); err != nil { - t.Errorf("golden is not idempotent: %s", err) - } - } -} - -func check(t *testing.T, source, golden string, mode checkMode) { - // run the test - cc := make(chan int, 1) - go func() { - runcheck(t, source, golden, mode) - cc <- 0 - }() - - // wait with timeout - select { - case <-time.After(10 * time.Second): // plenty of a safety margin, even for very slow machines - // test running past time out - t.Errorf("%s: running too slowly", source) - case <-cc: - // test finished within allotted time margin - } -} - -type entry struct { - source, golden string - mode checkMode -} - -// Use go test -update to create/update the respective golden files. -var data = []entry{ - {"empty.input", "empty.golden", idempotent}, - {"comments.input", "comments.golden", 0}, - {"comments.input", "comments.x", export}, - {"comments2.input", "comments2.golden", idempotent}, - {"alignment.input", "alignment.golden", idempotent}, - {"linebreaks.input", "linebreaks.golden", idempotent}, - {"expressions.input", "expressions.golden", idempotent}, - {"expressions.input", "expressions.raw", rawFormat | idempotent}, - {"declarations.input", "declarations.golden", 0}, - {"statements.input", "statements.golden", 0}, - {"slow.input", "slow.golden", idempotent}, - {"complit.input", "complit.x", export}, - {"go2numbers.input", "go2numbers.golden", idempotent}, - {"go2numbers.input", "go2numbers.norm", normNumber | idempotent}, - {"generics.input", "generics.golden", idempotent | allowTypeParams}, - {"gobuild1.input", "gobuild1.golden", idempotent}, - {"gobuild2.input", "gobuild2.golden", idempotent}, - {"gobuild3.input", "gobuild3.golden", idempotent}, - {"gobuild4.input", "gobuild4.golden", idempotent}, - {"gobuild5.input", "gobuild5.golden", idempotent}, - {"gobuild6.input", "gobuild6.golden", idempotent}, - {"gobuild7.input", "gobuild7.golden", idempotent}, -} - -func TestFiles(t *testing.T) { - t.Parallel() - for _, e := range data { - source := filepath.Join(dataDir, e.source) - golden := filepath.Join(dataDir, e.golden) - mode := e.mode - t.Run(e.source, func(t *testing.T) { - t.Parallel() - check(t, source, golden, mode) - // TODO(gri) check that golden is idempotent - //check(t, golden, golden, e.mode) - }) - } -} - -// TestLineComments, using a simple test case, checks that consecutive line -// comments are properly terminated with a newline even if the AST position -// information is incorrect. -func TestLineComments(t *testing.T) { - const src = `// comment 1 - // comment 2 - // comment 3 - package main - ` - - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - panic(err) // error in test - } - - var buf bytes.Buffer - fset = token.NewFileSet() // use the wrong file set - Fprint(&buf, fset, f) - - nlines := 0 - for _, ch := range buf.Bytes() { - if ch == '\n' { - nlines++ - } - } - - const expected = 3 - if nlines < expected { - t.Errorf("got %d, expected %d\n", nlines, expected) - t.Errorf("result:\n%s", buf.Bytes()) - } -} - -// Verify that the printer can be invoked during initialization. -func init() { - const name = "foobar" - var buf bytes.Buffer - if err := Fprint(&buf, fset, &ast.Ident{Name: name}); err != nil { - panic(err) // error in test - } - // in debug mode, the result contains additional information; - // ignore it - if s := buf.String(); !debug && s != name { - panic("got " + s + ", want " + name) - } -} - -// Verify that the printer doesn't crash if the AST contains BadXXX nodes. -func TestBadNodes(t *testing.T) { - const src = "package p\n(" - const res = "package p\nBadDecl\n" - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err == nil { - t.Error("expected illegal program") // error in test - } - var buf bytes.Buffer - Fprint(&buf, fset, f) - if buf.String() != res { - t.Errorf("got %q, expected %q", buf.String(), res) - } -} - -// testComment verifies that f can be parsed again after printing it -// with its first comment set to comment at any possible source offset. -func testComment(t *testing.T, f *ast.File, srclen int, comment *ast.Comment) { - f.Comments[0].List[0] = comment - var buf bytes.Buffer - for offs := 0; offs <= srclen; offs++ { - buf.Reset() - // Printing f should result in a correct program no - // matter what the (incorrect) comment position is. - if err := Fprint(&buf, fset, f); err != nil { - t.Error(err) - } - if _, err := parser.ParseFile(fset, "", buf.Bytes(), 0); err != nil { - t.Fatalf("incorrect program for pos = %d:\n%s", comment.Slash, buf.String()) - } - // Position information is just an offset. - // Move comment one byte down in the source. - comment.Slash++ - } -} - -// Verify that the printer produces a correct program -// even if the position information of comments introducing newlines -// is incorrect. -func TestBadComments(t *testing.T) { - t.Parallel() - const src = ` -// first comment - text and position changed by test -package p -import "fmt" -const pi = 3.14 // rough circle -var ( - x, y, z int = 1, 2, 3 - u, v float64 -) -func fibo(n int) { - if n < 2 { - return n /* seed values */ - } - return fibo(n-1) + fibo(n-2) -} -` - - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - t.Error(err) // error in test - } - - comment := f.Comments[0].List[0] - pos := comment.Pos() - if fset.PositionFor(pos, false /* absolute position */).Offset != 1 { - t.Error("expected offset 1") // error in test - } - - testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "//-style comment"}) - testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "/*-style comment */"}) - testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "/*-style \n comment */"}) - testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "/*-style comment \n\n\n */"}) -} - -type visitor chan *ast.Ident - -func (v visitor) Visit(n ast.Node) (w ast.Visitor) { - if ident, ok := n.(*ast.Ident); ok { - v <- ident - } - return v -} - -// idents is an iterator that returns all idents in f via the result channel. -func idents(f *ast.File) <-chan *ast.Ident { - v := make(visitor) - go func() { - ast.Walk(v, f) - close(v) - }() - return v -} - -// identCount returns the number of identifiers found in f. -func identCount(f *ast.File) int { - n := 0 - for range idents(f) { - n++ - } - return n -} - -// Verify that the SourcePos mode emits correct //line directives -// by testing that position information for matching identifiers -// is maintained. -func TestSourcePos(t *testing.T) { - const src = ` -package p -import ( "golang.org/x/website/internal/backport/go/printer"; "math" ) -const pi = 3.14; var x = 0 -type t struct{ x, y, z int; u, v, w float32 } -func (t *t) foo(a, b, c int) int { - return a*t.x + b*t.y + - // two extra lines here - // ... - c*t.z -} -` - - // parse original - f1, err := parser.ParseFile(fset, "src", src, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - - // pretty-print original - var buf bytes.Buffer - err = (&Config{Mode: UseSpaces | SourcePos, Tabwidth: 8}).Fprint(&buf, fset, f1) - if err != nil { - t.Fatal(err) - } - - // parse pretty printed original - // (//line directives must be interpreted even w/o parser.ParseComments set) - f2, err := parser.ParseFile(fset, "", buf.Bytes(), 0) - if err != nil { - t.Fatalf("%s\n%s", err, buf.Bytes()) - } - - // At this point the position information of identifiers in f2 should - // match the position information of corresponding identifiers in f1. - - // number of identifiers must be > 0 (test should run) and must match - n1 := identCount(f1) - n2 := identCount(f2) - if n1 == 0 { - t.Fatal("got no idents") - } - if n2 != n1 { - t.Errorf("got %d idents; want %d", n2, n1) - } - - // verify that all identifiers have correct line information - i2range := idents(f2) - for i1 := range idents(f1) { - i2 := <-i2range - - if i2.Name != i1.Name { - t.Errorf("got ident %s; want %s", i2.Name, i1.Name) - } - - // here we care about the relative (line-directive adjusted) positions - l1 := fset.Position(i1.Pos()).Line - l2 := fset.Position(i2.Pos()).Line - if l2 != l1 { - t.Errorf("got line %d; want %d for %s", l2, l1, i1.Name) - } - } - - if t.Failed() { - t.Logf("\n%s", buf.Bytes()) - } -} - -// Verify that the SourcePos mode doesn't emit unnecessary //line directives -// before empty lines. -func TestIssue5945(t *testing.T) { - const orig = ` -package p // line 2 -func f() {} // line 3 - -var x, y, z int - - -func g() { // line 8 -} -` - - const want = `//line src.go:2 -package p - -//line src.go:3 -func f() {} - -var x, y, z int - -//line src.go:8 -func g() { -} -` - - // parse original - f1, err := parser.ParseFile(fset, "src.go", orig, 0) - if err != nil { - t.Fatal(err) - } - - // pretty-print original - var buf bytes.Buffer - err = (&Config{Mode: UseSpaces | SourcePos, Tabwidth: 8}).Fprint(&buf, fset, f1) - if err != nil { - t.Fatal(err) - } - got := buf.String() - - // compare original with desired output - if got != want { - t.Errorf("got:\n%s\nwant:\n%s\n", got, want) - } -} - -var decls = []string{ - `import "fmt"`, - "const pi = 3.1415\nconst e = 2.71828\n\nvar x = pi", - "func sum(x, y int) int\t{ return x + y }", -} - -func TestDeclLists(t *testing.T) { - for _, src := range decls { - file, err := parser.ParseFile(fset, "", "package p;"+src, parser.ParseComments) - if err != nil { - panic(err) // error in test - } - - var buf bytes.Buffer - err = Fprint(&buf, fset, file.Decls) // only print declarations - if err != nil { - panic(err) // error in test - } - - out := buf.String() - if out != src { - t.Errorf("\ngot : %q\nwant: %q\n", out, src) - } - } -} - -var stmts = []string{ - "i := 0", - "select {}\nvar a, b = 1, 2\nreturn a + b", - "go f()\ndefer func() {}()", -} - -func TestStmtLists(t *testing.T) { - for _, src := range stmts { - file, err := parser.ParseFile(fset, "", "package p; func _() {"+src+"}", parser.ParseComments) - if err != nil { - panic(err) // error in test - } - - var buf bytes.Buffer - err = Fprint(&buf, fset, file.Decls[0].(*ast.FuncDecl).Body.List) // only print statements - if err != nil { - panic(err) // error in test - } - - out := buf.String() - if out != src { - t.Errorf("\ngot : %q\nwant: %q\n", out, src) - } - } -} - -func TestBaseIndent(t *testing.T) { - t.Parallel() - // The testfile must not contain multi-line raw strings since those - // are not indented (because their values must not change) and make - // this test fail. - const filename = "printer.go" - src, err := os.ReadFile(filename) - if err != nil { - panic(err) // error in test - } - - file, err := parser.ParseFile(fset, filename, src, 0) - if err != nil { - panic(err) // error in test - } - - for indent := 0; indent < 4; indent++ { - indent := indent - t.Run(fmt.Sprint(indent), func(t *testing.T) { - t.Parallel() - var buf bytes.Buffer - (&Config{Tabwidth: tabwidth, Indent: indent}).Fprint(&buf, fset, file) - // all code must be indented by at least 'indent' tabs - lines := bytes.Split(buf.Bytes(), []byte{'\n'}) - for i, line := range lines { - if len(line) == 0 { - continue // empty lines don't have indentation - } - n := 0 - for j, b := range line { - if b != '\t' { - // end of indentation - n = j - break - } - } - if n < indent { - t.Errorf("line %d: got only %d tabs; want at least %d: %q", i, n, indent, line) - } - } - }) - } -} - -// TestFuncType tests that an ast.FuncType with a nil Params field -// can be printed (per go/ast specification). Test case for issue 3870. -func TestFuncType(t *testing.T) { - src := &ast.File{ - Name: &ast.Ident{Name: "p"}, - Decls: []ast.Decl{ - &ast.FuncDecl{ - Name: &ast.Ident{Name: "f"}, - Type: &ast.FuncType{}, - }, - }, - } - - var buf bytes.Buffer - if err := Fprint(&buf, fset, src); err != nil { - t.Fatal(err) - } - got := buf.String() - - const want = `package p - -func f() -` - - if got != want { - t.Fatalf("got:\n%s\nwant:\n%s\n", got, want) - } -} - -type limitWriter struct { - remaining int - errCount int -} - -func (l *limitWriter) Write(buf []byte) (n int, err error) { - n = len(buf) - if n >= l.remaining { - n = l.remaining - err = io.EOF - l.errCount++ - } - l.remaining -= n - return n, err -} - -// Test whether the printer stops writing after the first error -func TestWriteErrors(t *testing.T) { - t.Parallel() - const filename = "printer.go" - src, err := os.ReadFile(filename) - if err != nil { - panic(err) // error in test - } - file, err := parser.ParseFile(fset, filename, src, 0) - if err != nil { - panic(err) // error in test - } - for i := 0; i < 20; i++ { - lw := &limitWriter{remaining: i} - err := (&Config{Mode: RawFormat}).Fprint(lw, fset, file) - if lw.errCount > 1 { - t.Fatal("Writes continued after first error returned") - } - // We expect errCount be 1 iff err is set - if (lw.errCount != 0) != (err != nil) { - t.Fatal("Expected err when errCount != 0") - } - } -} - -// TextX is a skeleton test that can be filled in for debugging one-off cases. -// Do not remove. -func TestX(t *testing.T) { - const src = ` -package p -func _() {} -` - _, err := format([]byte(src), 0) - if err != nil { - t.Error(err) - } -} - -func TestCommentedNode(t *testing.T) { - const ( - input = `package main - -func foo() { - // comment inside func -} - -// leading comment -type bar int // comment2 - -` - - foo = `func foo() { - // comment inside func -}` - - bar = `// leading comment -type bar int // comment2 -` - ) - - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "input.go", input, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - - var buf bytes.Buffer - - err = Fprint(&buf, fset, &CommentedNode{Node: f.Decls[0], Comments: f.Comments}) - if err != nil { - t.Fatal(err) - } - - if buf.String() != foo { - t.Errorf("got %q, want %q", buf.String(), foo) - } - - buf.Reset() - - err = Fprint(&buf, fset, &CommentedNode{Node: f.Decls[1], Comments: f.Comments}) - if err != nil { - t.Fatal(err) - } - - if buf.String() != bar { - t.Errorf("got %q, want %q", buf.String(), bar) - } -} - -func TestIssue11151(t *testing.T) { - const src = "package p\t/*\r/1\r*\r/2*\r\r\r\r/3*\r\r+\r\r/4*/\n" - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - t.Fatal(err) - } - - var buf bytes.Buffer - Fprint(&buf, fset, f) - got := buf.String() - const want = "package p\t/*/1*\r/2*\r/3*+/4*/\n" // \r following opening /* should be stripped - if got != want { - t.Errorf("\ngot : %q\nwant: %q", got, want) - } - - // the resulting program must be valid - _, err = parser.ParseFile(fset, "", got, 0) - if err != nil { - t.Errorf("%v\norig: %q\ngot : %q", err, src, got) - } -} - -// If a declaration has multiple specifications, a parenthesized -// declaration must be printed even if Lparen is token.NoPos. -func TestParenthesizedDecl(t *testing.T) { - // a package with multiple specs in a single declaration - const src = "package p; var ( a float64; b int )" - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "", src, 0) - if err != nil { - t.Fatal(err) - } - - // print the original package - var buf bytes.Buffer - err = Fprint(&buf, fset, f) - if err != nil { - t.Fatal(err) - } - original := buf.String() - - // now remove parentheses from the declaration - for i := 0; i != len(f.Decls); i++ { - f.Decls[i].(*ast.GenDecl).Lparen = token.NoPos - } - buf.Reset() - err = Fprint(&buf, fset, f) - if err != nil { - t.Fatal(err) - } - noparen := buf.String() - - if noparen != original { - t.Errorf("got %q, want %q", noparen, original) - } -} - -// Verify that we don't print a newline between "return" and its results, as -// that would incorrectly cause a naked return. -func TestIssue32854(t *testing.T) { - src := `package foo - -func f() { - return Composite{ - call(), - } -}` - fset := token.NewFileSet() - file, err := parser.ParseFile(fset, "", src, 0) - if err != nil { - panic(err) - } - - // Replace the result with call(), which is on the next line. - fd := file.Decls[0].(*ast.FuncDecl) - ret := fd.Body.List[0].(*ast.ReturnStmt) - ret.Results[0] = ret.Results[0].(*ast.CompositeLit).Elts[0] - - var buf bytes.Buffer - if err := Fprint(&buf, fset, ret); err != nil { - t.Fatal(err) - } - want := "return call()" - if got := buf.String(); got != want { - t.Fatalf("got %q, want %q", got, want) - } -} diff --git a/internal/backport/go/printer/testdata/alignment.golden b/internal/backport/go/printer/testdata/alignment.golden deleted file mode 100644 index 96086ed906..0000000000 --- a/internal/backport/go/printer/testdata/alignment.golden +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package alignment - -// ---------------------------------------------------------------------------- -// Examples from issue #7335. - -func main() { - z := MyStruct{ - Foo: "foo", - Bar: "bar", - Name: "name", - LongName: "longname", - Baz: "baz", - } - y := MyStruct{ - Foo: "foo", - Bar: "bar", - NameXX: "name", - LongNameXXXXXXXXXXXXX: "longname", - Baz: "baz", - } - z := MyStruct{ - Foo: "foo", - Bar: "bar", - Name: "name", - LongNameXXXXXXXXXXXXX: "longname", - Baz: "baz", - } -} - -// ---------------------------------------------------------------------------- -// Examples from issue #10392. - -var kcfg = KubeletConfig{ - Address: s.Address, - AllowPrivileged: s.AllowPrivileged, - HostNetworkSources: hostNetworkSources, - HostnameOverride: s.HostnameOverride, - RootDirectory: s.RootDirectory, - ConfigFile: s.Config, - ManifestURL: s.ManifestURL, - FileCheckFrequency: s.FileCheckFrequency, - HTTPCheckFrequency: s.HTTPCheckFrequency, - PodInfraContainerImage: s.PodInfraContainerImage, - SyncFrequency: s.SyncFrequency, - RegistryPullQPS: s.RegistryPullQPS, - RegistryBurst: s.RegistryBurst, - MinimumGCAge: s.MinimumGCAge, - MaxPerPodContainerCount: s.MaxPerPodContainerCount, - MaxContainerCount: s.MaxContainerCount, - ClusterDomain: s.ClusterDomain, - ClusterDNS: s.ClusterDNS, - Runonce: s.RunOnce, - Port: s.Port, - ReadOnlyPort: s.ReadOnlyPort, - CadvisorInterface: cadvisorInterface, - EnableServer: s.EnableServer, - EnableDebuggingHandlers: s.EnableDebuggingHandlers, - DockerClient: dockertools.ConnectToDockerOrDie(s.DockerEndpoint), - KubeClient: client, - MasterServiceNamespace: s.MasterServiceNamespace, - VolumePlugins: ProbeVolumePlugins(), - NetworkPlugins: ProbeNetworkPlugins(), - NetworkPluginName: s.NetworkPluginName, - StreamingConnectionIdleTimeout: s.StreamingConnectionIdleTimeout, - TLSOptions: tlsOptions, - ImageGCPolicy: imageGCPolicy, imageGCPolicy, - Cloud: cloud, - NodeStatusUpdateFrequency: s.NodeStatusUpdateFrequency, -} - -var a = A{ - Long: 1, - LongLong: 1, - LongLongLong: 1, - LongLongLongLong: 1, - LongLongLongLongLong: 1, - LongLongLongLongLongLong: 1, - LongLongLongLongLongLongLong: 1, - LongLongLongLongLongLongLongLong: 1, - Short: 1, - LongLongLongLongLongLongLongLongLong: 3, -} - -// ---------------------------------------------------------------------------- -// Examples from issue #22852. - -var fmtMap = map[string]string{ - "1": "123", - "12": "123", - "123": "123", - "1234": "123", - "12345": "123", - "123456": "123", - "12345678901234567890123456789": "123", - "abcde": "123", - "123456789012345678901234567890": "123", - "1234567": "123", - "abcdefghijklmnopqrstuvwxyzabcd": "123", - "abcd": "123", -} - -type Fmt struct { - abcdefghijklmnopqrstuvwx string - abcdefghijklmnopqrstuvwxy string - abcdefghijklmnopqrstuvwxyz string - abcdefghijklmnopqrstuvwxyza string - abcdefghijklmnopqrstuvwxyzab string - abcdefghijklmnopqrstuvwxyzabc string - abcde string - abcdefghijklmnopqrstuvwxyzabcde string - abcdefg string -} - -func main() { - _ := Fmt{ - abcdefghijklmnopqrstuvwx: "foo", - abcdefghijklmnopqrstuvwxyza: "foo", - abcdefghijklmnopqrstuvwxyzab: "foo", - abcdefghijklmnopqrstuvwxyzabc: "foo", - abcde: "foo", - abcdefghijklmnopqrstuvwxyzabcde: "foo", - abcdefg: "foo", - abcdefghijklmnopqrstuvwxy: "foo", - abcdefghijklmnopqrstuvwxyz: "foo", - } -} - -// ---------------------------------------------------------------------------- -// Examples from issue #26352. - -var _ = map[int]string{ - 1: "", - - 12345678901234567890123456789: "", - 12345678901234567890123456789012345678: "", -} - -func f() { - _ = map[int]string{ - 1: "", - - 12345678901234567: "", - 12345678901234567890123456789012345678901: "", - } -} - -// ---------------------------------------------------------------------------- -// Examples from issue #26930. - -var _ = S{ - F1: []string{}, - F2____: []string{}, -} - -var _ = S{ - F1: []string{}, - F2____: []string{}, -} - -var _ = S{ - F1____: []string{}, - F2: []string{}, -} - -var _ = S{ - F1____: []string{}, - F2: []string{}, -} diff --git a/internal/backport/go/printer/testdata/alignment.input b/internal/backport/go/printer/testdata/alignment.input deleted file mode 100644 index 323d2689e0..0000000000 --- a/internal/backport/go/printer/testdata/alignment.input +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package alignment - -// ---------------------------------------------------------------------------- -// Examples from issue #7335. - -func main() { - z := MyStruct{ - Foo: "foo", - Bar: "bar", - Name: "name", - LongName: "longname", - Baz: "baz", - } - y := MyStruct{ - Foo: "foo", - Bar: "bar", - NameXX: "name", - LongNameXXXXXXXXXXXXX: "longname", - Baz: "baz", - } - z := MyStruct{ - Foo: "foo", - Bar: "bar", - Name: "name", - LongNameXXXXXXXXXXXXX: "longname", - Baz: "baz", - } -} - -// ---------------------------------------------------------------------------- -// Examples from issue #10392. - -var kcfg = KubeletConfig{ - Address: s.Address, - AllowPrivileged: s.AllowPrivileged, - HostNetworkSources: hostNetworkSources, - HostnameOverride: s.HostnameOverride, - RootDirectory: s.RootDirectory, - ConfigFile: s.Config, - ManifestURL: s.ManifestURL, - FileCheckFrequency: s.FileCheckFrequency, - HTTPCheckFrequency: s.HTTPCheckFrequency, - PodInfraContainerImage: s.PodInfraContainerImage, - SyncFrequency: s.SyncFrequency, - RegistryPullQPS: s.RegistryPullQPS, - RegistryBurst: s.RegistryBurst, - MinimumGCAge: s.MinimumGCAge, - MaxPerPodContainerCount: s.MaxPerPodContainerCount, - MaxContainerCount: s.MaxContainerCount, - ClusterDomain: s.ClusterDomain, - ClusterDNS: s.ClusterDNS, - Runonce: s.RunOnce, - Port: s.Port, - ReadOnlyPort: s.ReadOnlyPort, - CadvisorInterface: cadvisorInterface, - EnableServer: s.EnableServer, - EnableDebuggingHandlers: s.EnableDebuggingHandlers, - DockerClient: dockertools.ConnectToDockerOrDie(s.DockerEndpoint), - KubeClient: client, - MasterServiceNamespace: s.MasterServiceNamespace, - VolumePlugins: ProbeVolumePlugins(), - NetworkPlugins: ProbeNetworkPlugins(), - NetworkPluginName: s.NetworkPluginName, - StreamingConnectionIdleTimeout: s.StreamingConnectionIdleTimeout, - TLSOptions: tlsOptions, - ImageGCPolicy: imageGCPolicy,imageGCPolicy, - Cloud: cloud, - NodeStatusUpdateFrequency: s.NodeStatusUpdateFrequency, -} - -var a = A{ - Long: 1, - LongLong: 1, - LongLongLong: 1, - LongLongLongLong: 1, - LongLongLongLongLong: 1, - LongLongLongLongLongLong: 1, - LongLongLongLongLongLongLong: 1, - LongLongLongLongLongLongLongLong: 1, - Short: 1, - LongLongLongLongLongLongLongLongLong: 3, -} - -// ---------------------------------------------------------------------------- -// Examples from issue #22852. - -var fmtMap = map[string]string{ - "1": "123", - "12": "123", - "123": "123", - "1234": "123", - "12345": "123", - "123456": "123", - "12345678901234567890123456789": "123", - "abcde": "123", - "123456789012345678901234567890": "123", - "1234567": "123", - "abcdefghijklmnopqrstuvwxyzabcd": "123", - "abcd": "123", -} - -type Fmt struct { - abcdefghijklmnopqrstuvwx string - abcdefghijklmnopqrstuvwxy string - abcdefghijklmnopqrstuvwxyz string - abcdefghijklmnopqrstuvwxyza string - abcdefghijklmnopqrstuvwxyzab string - abcdefghijklmnopqrstuvwxyzabc string - abcde string - abcdefghijklmnopqrstuvwxyzabcde string - abcdefg string -} - -func main() { - _ := Fmt{ - abcdefghijklmnopqrstuvwx: "foo", - abcdefghijklmnopqrstuvwxyza: "foo", - abcdefghijklmnopqrstuvwxyzab: "foo", - abcdefghijklmnopqrstuvwxyzabc: "foo", - abcde: "foo", - abcdefghijklmnopqrstuvwxyzabcde: "foo", - abcdefg: "foo", - abcdefghijklmnopqrstuvwxy: "foo", - abcdefghijklmnopqrstuvwxyz: "foo", - } -} - -// ---------------------------------------------------------------------------- -// Examples from issue #26352. - -var _ = map[int]string{ - 1: "", - - 12345678901234567890123456789: "", - 12345678901234567890123456789012345678: "", -} - -func f() { - _ = map[int]string{ - 1: "", - - 12345678901234567: "", - 12345678901234567890123456789012345678901: "", - } -} - -// ---------------------------------------------------------------------------- -// Examples from issue #26930. - -var _ = S{ - F1: []string{ - }, - F2____: []string{}, -} - -var _ = S{ - F1: []string{ - - - }, - F2____: []string{}, -} - -var _ = S{ - F1____: []string{ - }, - F2: []string{}, -} - -var _ = S{ - F1____: []string{ - - }, - F2: []string{}, -} diff --git a/internal/backport/go/printer/testdata/comments.golden b/internal/backport/go/printer/testdata/comments.golden deleted file mode 100644 index 1e5d17b4e1..0000000000 --- a/internal/backport/go/printer/testdata/comments.golden +++ /dev/null @@ -1,774 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This is a package for testing comment placement by go/printer. -package main - -import "fmt" // fmt - -const c0 = 0 // zero -const ( - c1 = iota // c1 - c2 // c2 -) - -// Alignment of comments in declarations> -const ( - _ T = iota // comment - _ // comment - _ // comment - _ = iota + 10 - _ // comments - - _ = 10 // comment - _ T = 20 // comment -) - -const ( - _____ = iota // foo - _ // bar - _ = 0 // bal - _ // bat -) - -const ( - _ T = iota // comment - _ // comment - _ // comment - _ = iota + 10 - _ // comment - _ = 10 - _ = 20 // comment - _ T = 0 // comment -) - -// The SZ struct; it is empty. -type SZ struct{} - -// The S0 struct; no field is exported. -type S0 struct { - int - x, y, z int // 3 unexported fields -} - -// The S1 struct; some fields are not exported. -type S1 struct { - S0 - A, B, C float // 3 exported fields - D, b, c int // 2 unexported fields -} - -// The S2 struct; all fields are exported. -type S2 struct { - S1 - A, B, C float // 3 exported fields -} - -// The IZ interface; it is empty. -type SZ interface{} - -// The I0 interface; no method is exported. -type I0 interface { - f(x int) int // unexported method -} - -// The I1 interface; some methods are not exported. -type I1 interface { - I0 - F(x float) float // exported methods - g(x int) int // unexported method -} - -// The I2 interface; all methods are exported. -type I2 interface { - I0 - F(x float) float // exported method - G(x float) float // exported method -} - -// The S3 struct; all comments except for the last one must appear in the export. -type S3 struct { - // lead comment for F1 - F1 int // line comment for F1 - // lead comment for F2 - F2 int // line comment for F2 - f3 int // f3 is not exported -} - -// Here is a comment. -// Here is an accidentally unindented line. -// More comment. -// -//dir:ect ive -type directiveCheck struct{} - -// This comment group should be separated -// with a newline from the next comment -// group. - -// This comment should NOT be associated with the next declaration. - -var x int // x -var () - -// This comment SHOULD be associated with f0. -func f0() { - const pi = 3.14 // pi - var s1 struct{} /* an empty struct */ /* foo */ - // a struct constructor - // -------------------- - var s2 struct{} = struct{}{} - x := pi -} - -// This comment should be associated with f1, with one blank line before the comment. -func f1() { - f0() - /* 1 */ - // 2 - /* 3 */ - /* 4 */ - f0() -} - -func _() { - // this comment should be properly indented -} - -func _(x int) int { - if x < 0 { // the tab printed before this comment's // must not affect the remaining lines - return -x // this statement should be properly indented - } - if x < 0 { /* the tab printed before this comment's /* must not affect the remaining lines */ - return -x // this statement should be properly indented - } - return x -} - -func typeswitch(x interface{}) { - switch v := x.(type) { - case bool, int, float: - case string: - default: - } - - switch x.(type) { - } - - switch v0, ok := x.(int); v := x.(type) { - } - - switch v0, ok := x.(int); x.(type) { - case byte: // this comment should be on the same line as the keyword - // this comment should be normally indented - _ = 0 - case bool, int, float: - // this comment should be indented - case string: - default: - // this comment should be indented - } - // this comment should not be indented -} - -// -// Indentation of comments after possibly indented multi-line constructs -// (test cases for issue 3147). -// - -func _() { - s := 1 + - 2 - // should be indented like s -} - -func _() { - s := 1 + - 2 // comment - // should be indented like s -} - -func _() { - s := 1 + - 2 // comment - // should be indented like s - _ = 0 -} - -func _() { - s := 1 + - 2 - // should be indented like s - _ = 0 -} - -func _() { - s := 1 + - 2 - - // should be indented like s -} - -func _() { - s := 1 + - 2 // comment - - // should be indented like s -} - -func _() { - s := 1 + - 2 // comment - - // should be indented like s - _ = 0 -} - -func _() { - s := 1 + - 2 - - // should be indented like s - _ = 0 -} - -// Test case from issue 3147. -func f() { - templateText := "a" + // A - "b" + // B - "c" // C - - // should be aligned with f() - f() -} - -// Modified test case from issue 3147. -func f() { - templateText := "a" + // A - "b" + // B - "c" // C - - // may not be aligned with f() (source is not aligned) - f() -} - -// -// Test cases for alignment of lines in general comments. -// - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line */ -} - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line */ -} - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line */ -} - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line */ -} - -// Issue 9751. -func _() { - /*a string - - b string*/ - - /*A string - - - - Z string*/ - - /*a string - - b string - - c string*/ - - { - /*a string - b string*/ - - /*a string - - b string*/ - - /*a string - - b string - - c string*/ - } - - { - /*a string - b string*/ - - /*a string - - b string*/ - - /*a string - - b string - - c string*/ - } - - /* - */ - - /* - - */ - - /* - - * line - - */ -} - -/* - * line - * of - * stars - */ - -/* another line - * of - * stars */ - -/* and another line - * of - * stars */ - -/* a line of - * stars */ - -/* and another line of - * stars */ - -/* a line of stars - */ - -/* and another line of - */ - -/* a line of stars - */ - -/* and another line of - */ - -/* -aligned in middle -here - not here -*/ - -/* -blank line in middle: - -with no leading spaces on blank line. -*/ - -/* - aligned in middle - here - not here -*/ - -/* - blank line in middle: - - with no leading spaces on blank line. -*/ - -func _() { - /* - * line - * of - * stars - */ - - /* - aligned in middle - here - not here - */ - - /* - blank line in middle: - - with no leading spaces on blank line. - */ -} - -// Some interesting interspersed comments. -// See below for more common cases. -func _( /* this */ x /* is */ /* an */ int) { -} - -func _( /* no params - extra blank before and after comment */ ) {} -func _(a, b int /* params - no extra blank after comment */) {} - -func _() { f( /* no args - extra blank before and after comment */ ) } -func _() { f(a, b /* args - no extra blank after comment */) } - -func _() { - f( /* no args - extra blank before and after comment */ ) - f(a, b /* args - no extra blank after comment */) -} - -func ( /* comment1 */ T /* comment2 */) _() {} - -func _() { /* "short-ish one-line functions with comments are formatted as multi-line functions */ } -func _() { x := 0; /* comment */ y = x /* comment */ } - -func _() { - _ = 0 - /* closing curly brace should be on new line */ -} - -func _() { - _ = []int{0, 1 /* don't introduce a newline after this comment - was issue 1365 */} -} - -// Test cases from issue 1542: -// Comments must not be placed before commas and cause invalid programs. -func _() { - var a = []int{1, 2 /*jasldf*/} - _ = a -} - -func _() { - var a = []int{1, 2}/*jasldf - */ - - _ = a -} - -func _() { - var a = []int{1, 2}// jasldf - - _ = a -} - -// Test cases from issues 11274, 15137: -// Semicolon must not be lost when multiple statements are on the same line with a comment. -func _() { - x := 0 /**/ - y := 1 -} - -func _() { - f() - f() - f() /* comment */ - f() - f() /* comment */ - f() - f() /* a */ /* b */ - f() - f() /* a */ /* b */ - f() - f() /* a */ /* b */ - f() -} - -func _() { - f() /* a */ /* b */ -} - -// Comments immediately adjacent to punctuation followed by a newline -// remain after the punctuation (looks better and permits alignment of -// comments). -func _() { - _ = T{ - 1, // comment after comma - 2, /* comment after comma */ - 3, // comment after comma - } - _ = T{ - 1, // comment after comma - 2, /* comment after comma */ - 3, // comment after comma - } - _ = T{ - /* comment before literal */ 1, - 2, /* comment before comma - ok to move after comma */ - 3, /* comment before comma - ok to move after comma */ - } - - for i = 0; // comment after semicolon - i < 9; /* comment after semicolon */ - i++ { // comment after opening curly brace - } - - // TODO(gri) the last comment in this example should be aligned */ - for i = 0; // comment after semicolon - i < 9; /* comment before semicolon - ok to move after semicolon */ - i++ /* comment before opening curly brace */ { - } -} - -// If there is no newline following punctuation, commas move before the punctuation. -// This way, commas interspersed in lists stay with the respective expression. -func f(x /* comment */, y int, z int /* comment */, u, v, w int /* comment */) { - f(x /* comment */, y) - f(x, /* comment */ - y) - f( - x, /* comment */ - ) -} - -func g( - x int, /* comment */ -) { -} - -type _ struct { - a, b /* comment */, c int -} - -type _ struct { - a, b /* comment */, c int -} - -func _() { - for a /* comment */, b := range x { - } -} - -//extern foo -func foo() {} - -//export bar -func bar() {} - -// Print line directives correctly. - -// The following is a legal line directive. -// -//line foo:1 -func _() { - _ = 0 - // The following is a legal line directive. It must not be indented: -//line foo:2 - _ = 1 - - // The following is not a legal line directive (it doesn't start in column 1): - //line foo:2 - _ = 2 - - // The following is not a legal line directive (missing colon): -//line foo -3 - _ = 3 -} - -// Line comments with tabs -func _() { - var finput *bufio.Reader // input file - var stderr *bufio.Writer - var ftable *bufio.Writer // y.go file - var foutput *bufio.Writer // y.output file - - var oflag string // -o [y.go] - y.go file - var vflag string // -v [y.output] - y.output file - var lflag bool // -l - disable line directives -} - -// Trailing white space in comments should be trimmed -func _() { - // This comment has 4 blanks following that should be trimmed: - /* Each line of this comment has blanks or tabs following that should be trimmed: - line 2: - line 3: - */ -} - -var _ = []T{ /* lone comment */ } - -var _ = []T{ - /* lone comment */ -} - -var _ = []T{ - // lone comments - // in composite lit -} - -var _ = [][]T{ - { - // lone comments - // in composite lit - }, -} - -// TODO: gofmt doesn't add these tabs; make it so that these golden -// tests run the printer in a way that it's exactly like gofmt. - -var _ = []T{ // lone comment -} - -var _ = []T{ // lone comments - // in composite lit -} - -func _() {} - -func _() {} - -/* This comment is the last entry in this file. It must be printed and should be followed by a newline */ diff --git a/internal/backport/go/printer/testdata/comments.input b/internal/backport/go/printer/testdata/comments.input deleted file mode 100644 index 40aa55be06..0000000000 --- a/internal/backport/go/printer/testdata/comments.input +++ /dev/null @@ -1,773 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This is a package for testing comment placement by go/printer. -// -package main - -import "fmt" // fmt - -const c0 = 0 // zero -const ( - c1 = iota // c1 - c2 // c2 -) - -// Alignment of comments in declarations> -const ( - _ T = iota // comment - _ // comment - _ // comment - _ = iota+10 - _ // comments - - _ = 10 // comment - _ T = 20 // comment -) - -const ( - _____ = iota // foo - _ // bar - _ = 0 // bal - _ // bat -) - -const ( - _ T = iota // comment - _ // comment - _ // comment - _ = iota + 10 - _ // comment - _ = 10 - _ = 20 // comment - _ T = 0 // comment -) - -// The SZ struct; it is empty. -type SZ struct {} - -// The S0 struct; no field is exported. -type S0 struct { - int - x, y, z int // 3 unexported fields -} - -// The S1 struct; some fields are not exported. -type S1 struct { - S0 - A, B, C float // 3 exported fields - D, b, c int // 2 unexported fields -} - -// The S2 struct; all fields are exported. -type S2 struct { - S1 - A, B, C float // 3 exported fields -} - -// The IZ interface; it is empty. -type SZ interface {} - -// The I0 interface; no method is exported. -type I0 interface { - f(x int) int // unexported method -} - -// The I1 interface; some methods are not exported. -type I1 interface { - I0 - F(x float) float // exported methods - g(x int) int // unexported method -} - -// The I2 interface; all methods are exported. -type I2 interface { - I0 - F(x float) float // exported method - G(x float) float // exported method -} - -// The S3 struct; all comments except for the last one must appear in the export. -type S3 struct { - // lead comment for F1 - F1 int // line comment for F1 - // lead comment for F2 - F2 int // line comment for F2 - f3 int // f3 is not exported -} - -// Here is a comment. -//Here is an accidentally unindented line. -//dir:ect ive -// More comment. -type directiveCheck struct{} - -// This comment group should be separated -// with a newline from the next comment -// group. - -// This comment should NOT be associated with the next declaration. - -var x int // x -var () - - -// This comment SHOULD be associated with f0. -func f0() { - const pi = 3.14 // pi - var s1 struct {} /* an empty struct */ /* foo */ - // a struct constructor - // -------------------- - var s2 struct {} = struct {}{} - x := pi -} -// -// This comment should be associated with f1, with one blank line before the comment. -// -func f1() { - f0() - /* 1 */ - // 2 - /* 3 */ - /* 4 */ - f0() -} - - -func _() { -// this comment should be properly indented -} - - -func _(x int) int { - if x < 0 { // the tab printed before this comment's // must not affect the remaining lines - return -x // this statement should be properly indented - } - if x < 0 { /* the tab printed before this comment's /* must not affect the remaining lines */ - return -x // this statement should be properly indented - } - return x -} - - -func typeswitch(x interface{}) { - switch v := x.(type) { - case bool, int, float: - case string: - default: - } - - switch x.(type) { - } - - switch v0, ok := x.(int); v := x.(type) { - } - - switch v0, ok := x.(int); x.(type) { - case byte: // this comment should be on the same line as the keyword - // this comment should be normally indented - _ = 0 - case bool, int, float: - // this comment should be indented - case string: - default: - // this comment should be indented - } - // this comment should not be indented -} - -// -// Indentation of comments after possibly indented multi-line constructs -// (test cases for issue 3147). -// - -func _() { - s := 1 + - 2 -// should be indented like s -} - -func _() { - s := 1 + - 2 // comment - // should be indented like s -} - -func _() { - s := 1 + - 2 // comment - // should be indented like s - _ = 0 -} - -func _() { - s := 1 + - 2 - // should be indented like s - _ = 0 -} - -func _() { - s := 1 + - 2 - -// should be indented like s -} - -func _() { - s := 1 + - 2 // comment - - // should be indented like s -} - -func _() { - s := 1 + - 2 // comment - - // should be indented like s - _ = 0 -} - -func _() { - s := 1 + - 2 - - // should be indented like s - _ = 0 -} - -// Test case from issue 3147. -func f() { - templateText := "a" + // A - "b" + // B - "c" // C - - // should be aligned with f() - f() -} - -// Modified test case from issue 3147. -func f() { - templateText := "a" + // A - "b" + // B - "c" // C - - // may not be aligned with f() (source is not aligned) - f() -} - -// -// Test cases for alignment of lines in general comments. -// - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line */ -} - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - aligned line */ -} - - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - aligned line */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line - */ -} - -func _() { - /* freestanding comment - aligned line */ -} - - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line */ -} - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line - */ -} - -func _() { - /* - freestanding comment - aligned line */ -} - -// Issue 9751. -func _() { - /*a string - - b string*/ - - /*A string - - - - Z string*/ - - /*a string - - b string - - c string*/ - - { - /*a string -b string*/ - - /*a string - -b string*/ - - /*a string - -b string - -c string*/ - } - - { - /*a string - b string*/ - - /*a string - - b string*/ - - /*a string - - b string - - c string*/ - } - - /* - */ - - /* - - */ - - /* - - * line - - */ -} - -/* - * line - * of - * stars - */ - -/* another line - * of - * stars */ - -/* and another line - * of - * stars */ - -/* a line of - * stars */ - -/* and another line of - * stars */ - -/* a line of stars -*/ - -/* and another line of -*/ - -/* a line of stars - */ - -/* and another line of - */ - -/* -aligned in middle -here - not here -*/ - -/* -blank line in middle: - -with no leading spaces on blank line. -*/ - -/* - aligned in middle - here - not here -*/ - -/* - blank line in middle: - - with no leading spaces on blank line. -*/ - -func _() { - /* - * line - * of - * stars - */ - - /* - aligned in middle - here - not here - */ - - /* - blank line in middle: - - with no leading spaces on blank line. -*/ -} - - -// Some interesting interspersed comments. -// See below for more common cases. -func _(/* this */x/* is *//* an */ int) { -} - -func _(/* no params - extra blank before and after comment */) {} -func _(a, b int /* params - no extra blank after comment */) {} - -func _() { f(/* no args - extra blank before and after comment */) } -func _() { f(a, b /* args - no extra blank after comment */) } - -func _() { - f(/* no args - extra blank before and after comment */) - f(a, b /* args - no extra blank after comment */) -} - -func (/* comment1 */ T /* comment2 */) _() {} - -func _() { /* "short-ish one-line functions with comments are formatted as multi-line functions */ } -func _() { x := 0; /* comment */ y = x /* comment */ } - -func _() { - _ = 0 - /* closing curly brace should be on new line */ } - -func _() { - _ = []int{0, 1 /* don't introduce a newline after this comment - was issue 1365 */} -} - -// Test cases from issue 1542: -// Comments must not be placed before commas and cause invalid programs. -func _() { - var a = []int{1, 2, /*jasldf*/ - } - _ = a -} - -func _() { - var a = []int{1, 2, /*jasldf - */ - } - _ = a -} - -func _() { - var a = []int{1, 2, // jasldf - } - _ = a -} - -// Test cases from issues 11274, 15137: -// Semicolon must not be lost when multiple statements are on the same line with a comment. -func _() { - x := 0 /**/; y := 1 -} - -func _() { - f(); f() - f(); /* comment */ f() - f() /* comment */; f() - f(); /* a */ /* b */ f() - f() /* a */ /* b */; f() - f() /* a */; /* b */ f() -} - -func _() { - f() /* a */ /* b */ } - -// Comments immediately adjacent to punctuation followed by a newline -// remain after the punctuation (looks better and permits alignment of -// comments). -func _() { - _ = T{ - 1, // comment after comma - 2, /* comment after comma */ - 3 , // comment after comma - } - _ = T{ - 1 ,// comment after comma - 2 ,/* comment after comma */ - 3,// comment after comma - } - _ = T{ - /* comment before literal */1, - 2/* comment before comma - ok to move after comma */, - 3 /* comment before comma - ok to move after comma */ , - } - - for - i=0;// comment after semicolon - i<9;/* comment after semicolon */ - i++{// comment after opening curly brace - } - - // TODO(gri) the last comment in this example should be aligned */ - for - i=0;// comment after semicolon - i<9/* comment before semicolon - ok to move after semicolon */; - i++ /* comment before opening curly brace */ { - } -} - -// If there is no newline following punctuation, commas move before the punctuation. -// This way, commas interspersed in lists stay with the respective expression. -func f(x/* comment */, y int, z int /* comment */, u, v, w int /* comment */) { - f(x /* comment */, y) - f(x /* comment */, - y) - f( - x /* comment */, - ) -} - -func g( - x int /* comment */, -) {} - -type _ struct { - a, b /* comment */, c int -} - -type _ struct { a, b /* comment */, c int } - -func _() { - for a /* comment */, b := range x { - } -} - -//extern foo -func foo() {} - -//export bar -func bar() {} - -// Print line directives correctly. - -// The following is a legal line directive. -//line foo:1 -func _() { - _ = 0 -// The following is a legal line directive. It must not be indented: -//line foo:2 - _ = 1 - -// The following is not a legal line directive (it doesn't start in column 1): - //line foo:2 - _ = 2 - -// The following is not a legal line directive (missing colon): -//line foo -3 - _ = 3 -} - -// Line comments with tabs -func _() { -var finput *bufio.Reader // input file -var stderr *bufio.Writer -var ftable *bufio.Writer // y.go file -var foutput *bufio.Writer // y.output file - -var oflag string // -o [y.go] - y.go file -var vflag string // -v [y.output] - y.output file -var lflag bool // -l - disable line directives -} - -// Trailing white space in comments should be trimmed -func _() { -// This comment has 4 blanks following that should be trimmed: -/* Each line of this comment has blanks or tabs following that should be trimmed: - line 2: - line 3: -*/ -} - -var _ = []T{/* lone comment */} - -var _ = []T{ -/* lone comment */ -} - -var _ = []T{ -// lone comments -// in composite lit -} - -var _ = [][]T{ - { - // lone comments - // in composite lit - }, -} - -// TODO: gofmt doesn't add these tabs; make it so that these golden -// tests run the printer in a way that it's exactly like gofmt. - -var _ = []T{// lone comment -} - -var _ = []T{// lone comments -// in composite lit -} - -func _() {} - -// -func _() {} - -/* This comment is the last entry in this file. It must be printed and should be followed by a newline */ diff --git a/internal/backport/go/printer/testdata/comments.x b/internal/backport/go/printer/testdata/comments.x deleted file mode 100644 index 5d088ab2c3..0000000000 --- a/internal/backport/go/printer/testdata/comments.x +++ /dev/null @@ -1,55 +0,0 @@ -// This is a package for testing comment placement by go/printer. -package main - -// The SZ struct; it is empty. -type SZ struct{} - -// The S0 struct; no field is exported. -type S0 struct { - // contains filtered or unexported fields -} - -// The S1 struct; some fields are not exported. -type S1 struct { - S0 - A, B, C float // 3 exported fields - D int // 2 unexported fields - // contains filtered or unexported fields -} - -// The S2 struct; all fields are exported. -type S2 struct { - S1 - A, B, C float // 3 exported fields -} - -// The IZ interface; it is empty. -type SZ interface{} - -// The I0 interface; no method is exported. -type I0 interface { - // contains filtered or unexported methods -} - -// The I1 interface; some methods are not exported. -type I1 interface { - I0 - F(x float) float // exported methods - // contains filtered or unexported methods -} - -// The I2 interface; all methods are exported. -type I2 interface { - I0 - F(x float) float // exported method - G(x float) float // exported method -} - -// The S3 struct; all comments except for the last one must appear in the export. -type S3 struct { - // lead comment for F1 - F1 int // line comment for F1 - // lead comment for F2 - F2 int // line comment for F2 - // contains filtered or unexported fields -} diff --git a/internal/backport/go/printer/testdata/comments2.golden b/internal/backport/go/printer/testdata/comments2.golden deleted file mode 100644 index 83213d1a9d..0000000000 --- a/internal/backport/go/printer/testdata/comments2.golden +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This is a package for testing comment placement by go/printer. -package main - -// Test cases for idempotent comment formatting (was issue 1835). -/* -c1a -*/ -/* - c1b -*/ -/* foo -c1c -*/ -/* foo - c1d -*/ -/* -c1e -foo */ -/* - c1f - foo */ - -func f() { - /* - c2a - */ - /* - c2b - */ - /* foo - c2c - */ - /* foo - c2d - */ - /* - c2e - foo */ - /* - c2f - foo */ -} - -func g() { - /* - c3a - */ - /* - c3b - */ - /* foo - c3c - */ - /* foo - c3d - */ - /* - c3e - foo */ - /* - c3f - foo */ -} - -// Test case taken literally from issue 1835. -func main() { - /* - prints test 5 times - */ - for i := 0; i < 5; i++ { - println("test") - } -} - -func issue5623() { -L: - _ = yyyyyyyyyyyyyyyy // comment - should be aligned - _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx /* comment */ - - _ = yyyyyyyyyyyyyyyy /* comment - should be aligned */ - _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx // comment - -LLLLLLL: - _ = yyyyyyyyyyyyyyyy // comment - should be aligned - _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx // comment - -LL: -LLLLL: - _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx /* comment */ - _ = yyyyyyyyyyyyyyyy /* comment - should be aligned */ - - _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx // comment - _ = yyyyyyyyyyyyyyyy // comment - should be aligned - - // test case from issue -label: - mask := uint64(1)<>4 - _ = "foo" + s - _ = s + "foo" - _ = 'a' + 'b' - _ = len(s) / 2 - _ = len(t0.x) / a - - // spaces around expressions of different precedence or expressions containing spaces - _ = a + -b - _ = a - ^b - _ = a / *p - _ = a + b*c - _ = 1 + b*c - _ = a + 2*c - _ = a + c*2 - _ = 1 + 2*3 - _ = s[1 : 2*3] - _ = s[a : b-c] - _ = s[0:] - _ = s[a+b] - _ = s[:b-c] - _ = s[a+b:] - _ = a[a< b - _ = a >= b - _ = a < b - _ = a <= b - _ = a < b && c > d - _ = a < b || c > d - - // spaces around "long" operands - _ = a + longIdentifier1 - _ = longIdentifier1 + a - _ = longIdentifier1 + longIdentifier2*longIdentifier3 - _ = s + "a longer string" - - // some selected cases - _ = a + t0.x - _ = a + t0.x + t1.x*t2.x - _ = a + b + c + d + e + 2*3 - _ = a + b + c + 2*3 + d + e - _ = (a + b + c) * 2 - _ = a - b + c - d + (a + b + c) + d&e - _ = under_bar - 1 - _ = Open(dpath+"/file", O_WRONLY|O_CREAT, 0666) - _ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx) - - // test case for issue 8021 - // want: - // ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]] - _ = ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]] - - // the parser does not restrict expressions that may appear as statements - true - 42 - "foo" - x - (x) - a + b - a + b + c - a + (b * c) - a + (b / c) - 1 + a - a + 1 - s[a] - x << 1 - (s[0] << 1) & 0xf - "foo" + s - x == y - x < y || z > 42 -} - -// slice expressions with cap -func _() { - _ = x[a:b:c] - _ = x[a : b : c+d] - _ = x[a : b+d : c] - _ = x[a : b+d : c+d] - _ = x[a+d : b : c] - _ = x[a+d : b : c+d] - _ = x[a+d : b+d : c] - _ = x[a+d : b+d : c+d] - - _ = x[:b:c] - _ = x[: b : c+d] - _ = x[: b+d : c] - _ = x[: b+d : c+d] -} - -func issue22111() { - _ = x[:] - - _ = x[:b] - _ = x[:b+1] - - _ = x[a:] - _ = x[a+1:] - - _ = x[a:b] - _ = x[a+1 : b] - _ = x[a : b+1] - _ = x[a+1 : b+1] - - _ = x[:b:c] - _ = x[: b+1 : c] - _ = x[: b : c+1] - _ = x[: b+1 : c+1] - - _ = x[a:b:c] - _ = x[a+1 : b : c] - _ = x[a : b+1 : c] - _ = x[a+1 : b+1 : c] - _ = x[a : b : c+1] - _ = x[a+1 : b : c+1] - _ = x[a : b+1 : c+1] - _ = x[a+1 : b+1 : c+1] -} - -func _() { - _ = a + b - _ = a + b + c - _ = a + b*c - _ = a + (b * c) - _ = (a + b) * c - _ = a + (b * c * d) - _ = a + (b*c + d) - - _ = 1 << x - _ = -1 << x - _ = 1<>4 - - b.buf = b.buf[0 : b.off+m+n] - b.buf = b.buf[0 : b.off+m*n] - f(b.buf[0 : b.off+m+n]) - - signed += ' ' * 8 - tw.octal(header[148:155], chksum) - - _ = x > 0 && i >= 0 - - x1, x0 := x>>w2, x&m2 - z0 = t1<>w2) >> w2 - q1, r1 := x1/d1, x1%d1 - r1 = r1*b2 | x0>>w2 - x1 = (x1 << z) | (x0 >> (uint(w) - z)) - x1 = x1<>(uint(w)-z) - - _ = buf[0 : len(buf)+1] - _ = buf[0 : n+1] - - a, b = b, a - a = b + c - a = b*c + d - _ = a*b + c - _ = a - b - c - _ = a - (b - c) - _ = a - b*c - _ = a - (b * c) - _ = a * b / c - _ = a / *b - _ = x[a|^b] - _ = x[a / *b] - _ = a & ^b - _ = a + +b - _ = a - -b - _ = x[a*-b] - _ = x[a + +b] - _ = x ^ y ^ z - _ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF] - _ = len(longVariableName) * 2 - - _ = token(matchType + xlength<> 4 - _ = "foo"+s - _ = s+"foo" - _ = 'a'+'b' - _ = len(s)/2 - _ = len(t0.x)/a - - // spaces around expressions of different precedence or expressions containing spaces - _ = a + -b - _ = a - ^b - _ = a / *p - _ = a + b*c - _ = 1 + b*c - _ = a + 2*c - _ = a + c*2 - _ = 1 + 2*3 - _ = s[1 : 2*3] - _ = s[a : b-c] - _ = s[0:] - _ = s[a+b] - _ = s[: b-c] - _ = s[a+b :] - _ = a[a< b - _ = a >= b - _ = a < b - _ = a <= b - _ = a < b && c > d - _ = a < b || c > d - - // spaces around "long" operands - _ = a + longIdentifier1 - _ = longIdentifier1 + a - _ = longIdentifier1 + longIdentifier2 * longIdentifier3 - _ = s + "a longer string" - - // some selected cases - _ = a + t0.x - _ = a + t0.x + t1.x * t2.x - _ = a + b + c + d + e + 2*3 - _ = a + b + c + 2*3 + d + e - _ = (a+b+c)*2 - _ = a - b + c - d + (a+b+c) + d&e - _ = under_bar-1 - _ = Open(dpath + "/file", O_WRONLY | O_CREAT, 0666) - _ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx) - - // test case for issue 8021 - // want: - // ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]] - _ = ([]bool{})[([]int{})[((1) + (((((1) + (((((((1) * (((((1) + (1))) + (1))))) + (1))) * (1))))) + (1))))]] - - // the parser does not restrict expressions that may appear as statements - true - 42 - "foo" - x - (x) - a+b - a+b+c - a+(b*c) - a+(b/c) - 1+a - a+1 - s[a] - x<<1 - (s[0]<<1)&0xf - "foo"+s - x == y - x < y || z > 42 -} - - -// slice expressions with cap -func _() { - _ = x[a:b:c] - _ = x[a:b:c+d] - _ = x[a:b+d:c] - _ = x[a:b+d:c+d] - _ = x[a+d:b:c] - _ = x[a+d:b:c+d] - _ = x[a+d:b+d:c] - _ = x[a+d:b+d:c+d] - - _ = x[:b:c] - _ = x[:b:c+d] - _ = x[:b+d:c] - _ = x[:b+d:c+d] -} - -func issue22111() { - _ = x[:] - - _ = x[:b] - _ = x[:b+1] - - _ = x[a:] - _ = x[a+1:] - - _ = x[a:b] - _ = x[a+1:b] - _ = x[a:b+1] - _ = x[a+1:b+1] - - _ = x[:b:c] - _ = x[:b+1:c] - _ = x[:b:c+1] - _ = x[:b+1:c+1] - - _ = x[a:b:c] - _ = x[a+1:b:c] - _ = x[a:b+1:c] - _ = x[a+1:b+1:c] - _ = x[a:b:c+1] - _ = x[a+1:b:c+1] - _ = x[a:b+1:c+1] - _ = x[a+1:b+1:c+1] -} - -func _() { - _ = a+b - _ = a+b+c - _ = a+b*c - _ = a+(b*c) - _ = (a+b)*c - _ = a+(b*c*d) - _ = a+(b*c+d) - - _ = 1<>4 - - b.buf = b.buf[0:b.off+m+n] - b.buf = b.buf[0:b.off+m*n] - f(b.buf[0:b.off+m+n]) - - signed += ' '*8 - tw.octal(header[148:155], chksum) - - _ = x > 0 && i >= 0 - - x1, x0 := x>>w2, x&m2 - z0 = t1<>w2)>>w2 - q1, r1 := x1/d1, x1%d1 - r1 = r1*b2 | x0>>w2 - x1 = (x1<>(uint(w)-z)) - x1 = x1<>(uint(w)-z) - - _ = buf[0:len(buf)+1] - _ = buf[0:n+1] - - a,b = b,a - a = b+c - a = b*c+d - _ = a*b+c - _ = a-b-c - _ = a-(b-c) - _ = a-b*c - _ = a-(b*c) - _ = a*b/c - _ = a/ *b - _ = x[a|^b] - _ = x[a/ *b] - _ = a& ^b - _ = a+ +b - _ = a- -b - _ = x[a*-b] - _ = x[a+ +b] - _ = x^y^z - _ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF] - _ = len(longVariableName)*2 - - _ = token(matchType + xlength<>4 - _ = "foo" + s - _ = s + "foo" - _ = 'a' + 'b' - _ = len(s) / 2 - _ = len(t0.x) / a - - // spaces around expressions of different precedence or expressions containing spaces - _ = a + -b - _ = a - ^b - _ = a / *p - _ = a + b*c - _ = 1 + b*c - _ = a + 2*c - _ = a + c*2 - _ = 1 + 2*3 - _ = s[1 : 2*3] - _ = s[a : b-c] - _ = s[0:] - _ = s[a+b] - _ = s[:b-c] - _ = s[a+b:] - _ = a[a< b - _ = a >= b - _ = a < b - _ = a <= b - _ = a < b && c > d - _ = a < b || c > d - - // spaces around "long" operands - _ = a + longIdentifier1 - _ = longIdentifier1 + a - _ = longIdentifier1 + longIdentifier2*longIdentifier3 - _ = s + "a longer string" - - // some selected cases - _ = a + t0.x - _ = a + t0.x + t1.x*t2.x - _ = a + b + c + d + e + 2*3 - _ = a + b + c + 2*3 + d + e - _ = (a + b + c) * 2 - _ = a - b + c - d + (a + b + c) + d&e - _ = under_bar - 1 - _ = Open(dpath+"/file", O_WRONLY|O_CREAT, 0666) - _ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx) - - // test case for issue 8021 - // want: - // ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]] - _ = ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]] - - // the parser does not restrict expressions that may appear as statements - true - 42 - "foo" - x - (x) - a + b - a + b + c - a + (b * c) - a + (b / c) - 1 + a - a + 1 - s[a] - x << 1 - (s[0] << 1) & 0xf - "foo" + s - x == y - x < y || z > 42 -} - -// slice expressions with cap -func _() { - _ = x[a:b:c] - _ = x[a : b : c+d] - _ = x[a : b+d : c] - _ = x[a : b+d : c+d] - _ = x[a+d : b : c] - _ = x[a+d : b : c+d] - _ = x[a+d : b+d : c] - _ = x[a+d : b+d : c+d] - - _ = x[:b:c] - _ = x[: b : c+d] - _ = x[: b+d : c] - _ = x[: b+d : c+d] -} - -func issue22111() { - _ = x[:] - - _ = x[:b] - _ = x[:b+1] - - _ = x[a:] - _ = x[a+1:] - - _ = x[a:b] - _ = x[a+1 : b] - _ = x[a : b+1] - _ = x[a+1 : b+1] - - _ = x[:b:c] - _ = x[: b+1 : c] - _ = x[: b : c+1] - _ = x[: b+1 : c+1] - - _ = x[a:b:c] - _ = x[a+1 : b : c] - _ = x[a : b+1 : c] - _ = x[a+1 : b+1 : c] - _ = x[a : b : c+1] - _ = x[a+1 : b : c+1] - _ = x[a : b+1 : c+1] - _ = x[a+1 : b+1 : c+1] -} - -func _() { - _ = a + b - _ = a + b + c - _ = a + b*c - _ = a + (b * c) - _ = (a + b) * c - _ = a + (b * c * d) - _ = a + (b*c + d) - - _ = 1 << x - _ = -1 << x - _ = 1<>4 - - b.buf = b.buf[0 : b.off+m+n] - b.buf = b.buf[0 : b.off+m*n] - f(b.buf[0 : b.off+m+n]) - - signed += ' ' * 8 - tw.octal(header[148:155], chksum) - - _ = x > 0 && i >= 0 - - x1, x0 := x>>w2, x&m2 - z0 = t1<>w2) >> w2 - q1, r1 := x1/d1, x1%d1 - r1 = r1*b2 | x0>>w2 - x1 = (x1 << z) | (x0 >> (uint(w) - z)) - x1 = x1<>(uint(w)-z) - - _ = buf[0 : len(buf)+1] - _ = buf[0 : n+1] - - a, b = b, a - a = b + c - a = b*c + d - _ = a*b + c - _ = a - b - c - _ = a - (b - c) - _ = a - b*c - _ = a - (b * c) - _ = a * b / c - _ = a / *b - _ = x[a|^b] - _ = x[a / *b] - _ = a & ^b - _ = a + +b - _ = a - -b - _ = x[a*-b] - _ = x[a + +b] - _ = x ^ y ^ z - _ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF] - _ = len(longVariableName) * 2 - - _ = token(matchType + xlength< /tmp/16gig.txt - // tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar - &writerTest{ - file: "testdata/writer-big.tar", - entries: []*writerTestEntry{ - &writerTestEntry{ - header: &Header{ - Name: "tmp/16gig.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 16 << 30, - Mtime: 1254699560, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - // no contents - }, - }, - }, -} - -type untarTest struct { - file string - headers []*Header -} - -var untarTests = []*untarTest{ - &untarTest{ - file: "testdata/gnu.tar", - headers: []*Header{ - &Header{ - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - Mtime: 1244428340, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - &Header{ - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - Mtime: 1244436044, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - }, - }, - &untarTest{ - file: "testdata/star.tar", - headers: []*Header{ - &Header{ - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - Mtime: 1244592783, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - Atime: 1244592783, - Ctime: 1244592783, - }, - &Header{ - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - Mtime: 1244592783, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - Atime: 1244592783, - Ctime: 1244592783, - }, - }, - }, - &untarTest{ - file: "testdata/v7.tar", - headers: []*Header{ - &Header{ - Name: "small.txt", - Mode: 0444, - Uid: 73025, - Gid: 5000, - Size: 5, - Mtime: 1244593104, - Typeflag: '\x00', - }, - &Header{ - Name: "small2.txt", - Mode: 0444, - Uid: 73025, - Gid: 5000, - Size: 11, - Mtime: 1244593104, - Typeflag: '\x00', - }, - }, - }, -} - -var facts = map[int]string{ - 0: "1", - 1: "1", - 2: "2", - 10: "3628800", - 20: "2432902008176640000", - 100: "933262154439441526816992388562667004907159682643816214685929" + - "638952175999932299156089414639761565182862536979208272237582" + - "51185210916864000000000000000000000000", -} - -func usage() { - fmt.Fprintf(os.Stderr, - // TODO(gri): the 2nd string of this string list should not be indented - "usage: godoc package [name ...]\n"+ - " godoc -http=:6060\n") - flag.PrintDefaults() - os.Exit(2) -} - -func TestReader(t *testing.T) { -testLoop: - for i, test := range untarTests { - f, err := os.Open(test.file, os.O_RDONLY, 0444) - if err != nil { - t.Errorf("test %d: Unexpected error: %v", i, err) - continue - } - tr := NewReader(f) - for j, header := range test.headers { - hdr, err := tr.Next() - if err != nil || hdr == nil { - t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err) - f.Close() - continue testLoop - } - if !reflect.DeepEqual(hdr, header) { - t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v", - i, j, *hdr, *header) - } - } - hdr, err := tr.Next() - if hdr != nil || err != nil { - t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, err) - } - f.Close() - } -} - -// Respect line breaks in function calls. -func _() { - f(x) - f(x, - x) - f(x, - x, - ) - f( - x, - x) - f( - x, - x, - ) -} - -// Respect line breaks in function declarations. -func _(x T) {} -func _(x T, - y T) { -} -func _(x T, - y T, -) { -} -func _( - x T, - y T) { -} -func _( - x T, - y T, -) { -} - -// Example from issue #2597. -func ManageStatus0( - in <-chan *Status, - req <-chan Request, - stat chan<- *TargetInfo, - TargetHistorySize int) { -} - -func ManageStatus1( - in <-chan *Status, - req <-chan Request, - stat chan<- *TargetInfo, - TargetHistorySize int, -) { -} - -// Example from issue #9064. -func (y *y) xerrors() error { - _ = "xerror.test" //TODO- - _ = []byte(` -foo bar foo bar foo bar -`) //TODO- -} - -func _() { - _ = "abc" // foo - _ = `abc_0123456789_` // foo -} - -func _() { - _ = "abc" // foo - _ = `abc -0123456789 -` // foo -} - -// There should be exactly one linebreak after this comment. diff --git a/internal/backport/go/printer/testdata/linebreaks.input b/internal/backport/go/printer/testdata/linebreaks.input deleted file mode 100644 index 9e714f3eff..0000000000 --- a/internal/backport/go/printer/testdata/linebreaks.input +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package linebreaks - -import ( - "bytes" - "fmt" - "io" - "os" - "reflect" - "strings" - "testing" -) - -type writerTestEntry struct { - header *Header - contents string -} - -type writerTest struct { - file string // filename of expected output - entries []*writerTestEntry -} - -var writerTests = []*writerTest{ - &writerTest{ - file: "testdata/writer.tar", - entries: []*writerTestEntry{ - &writerTestEntry{ - header: &Header{ - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - Mtime: 1246508266, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - contents: "Kilts", - }, - &writerTestEntry{ - header: &Header{ - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - Mtime: 1245217492, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - contents: "Google.com\n", - }, - }, - }, - // The truncated test file was produced using these commands: - // dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt - // tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar - &writerTest{ - file: "testdata/writer-big.tar", - entries: []*writerTestEntry{ - &writerTestEntry{ - header: &Header{ - Name: "tmp/16gig.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 16 << 30, - Mtime: 1254699560, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - // no contents - }, - }, - }, -} - -type untarTest struct { - file string - headers []*Header -} - -var untarTests = []*untarTest{ - &untarTest{ - file: "testdata/gnu.tar", - headers: []*Header{ - &Header{ - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - Mtime: 1244428340, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - &Header{ - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - Mtime: 1244436044, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - }, - }, - &untarTest{ - file: "testdata/star.tar", - headers: []*Header{ - &Header{ - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - Mtime: 1244592783, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - Atime: 1244592783, - Ctime: 1244592783, - }, - &Header{ - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - Mtime: 1244592783, - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - Atime: 1244592783, - Ctime: 1244592783, - }, - }, - }, - &untarTest{ - file: "testdata/v7.tar", - headers: []*Header{ - &Header{ - Name: "small.txt", - Mode: 0444, - Uid: 73025, - Gid: 5000, - Size: 5, - Mtime: 1244593104, - Typeflag: '\x00', - }, - &Header{ - Name: "small2.txt", - Mode: 0444, - Uid: 73025, - Gid: 5000, - Size: 11, - Mtime: 1244593104, - Typeflag: '\x00', - }, - }, - }, -} - -var facts = map[int] string { - 0: "1", - 1: "1", - 2: "2", - 10: "3628800", - 20: "2432902008176640000", - 100: "933262154439441526816992388562667004907159682643816214685929" + - "638952175999932299156089414639761565182862536979208272237582" + - "51185210916864000000000000000000000000", -} - -func usage() { - fmt.Fprintf(os.Stderr, - // TODO(gri): the 2nd string of this string list should not be indented - "usage: godoc package [name ...]\n" + - " godoc -http=:6060\n") - flag.PrintDefaults() - os.Exit(2) -} - -func TestReader(t *testing.T) { -testLoop: - for i, test := range untarTests { - f, err := os.Open(test.file, os.O_RDONLY, 0444) - if err != nil { - t.Errorf("test %d: Unexpected error: %v", i, err) - continue - } - tr := NewReader(f) - for j, header := range test.headers { - hdr, err := tr.Next() - if err != nil || hdr == nil { - t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err) - f.Close() - continue testLoop - } - if !reflect.DeepEqual(hdr, header) { - t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v", - i, j, *hdr, *header) - } - } - hdr, err := tr.Next() - if hdr != nil || err != nil { - t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, err) - } - f.Close() - } -} - -// Respect line breaks in function calls. -func _() { - f(x) - f(x, - x) - f(x, - x, - ) - f( - x, - x) - f( - x, - x, - ) -} - -// Respect line breaks in function declarations. -func _(x T) {} -func _(x T, - y T) {} -func _(x T, - y T, -) {} -func _( - x T, - y T) {} -func _( - x T, - y T, -) {} - -// Example from issue #2597. -func ManageStatus0( - in <-chan *Status, - req <-chan Request, - stat chan<- *TargetInfo, - TargetHistorySize int) { -} - -func ManageStatus1( - in <-chan *Status, - req <-chan Request, - stat chan<- *TargetInfo, - TargetHistorySize int, -) { -} - -// Example from issue #9064. -func (y *y) xerrors() error { - _ = "xerror.test" //TODO- - _ = []byte(` -foo bar foo bar foo bar -`) //TODO- -} - -func _() { - _ = "abc" // foo - _ = `abc_0123456789_` // foo -} - -func _() { - _ = "abc" // foo - _ = `abc -0123456789 -` // foo -} - -// There should be exactly one linebreak after this comment. diff --git a/internal/backport/go/printer/testdata/parser.go b/internal/backport/go/printer/testdata/parser.go deleted file mode 100644 index 8479cb6ac0..0000000000 --- a/internal/backport/go/printer/testdata/parser.go +++ /dev/null @@ -1,2148 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package parser implements a parser for Go source files. Input may be -// provided in a variety of forms (see the various Parse* functions); the -// output is an abstract syntax tree (AST) representing the Go source. The -// parser is invoked through one of the Parse* functions. - -package parser - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/scanner" - "golang.org/x/website/internal/backport/go/token" -) - -// The mode parameter to the Parse* functions is a set of flags (or 0). -// They control the amount of source code parsed and other optional -// parser functionality. -const ( - PackageClauseOnly uint = 1 << iota // parsing stops after package clause - ImportsOnly // parsing stops after import declarations - ParseComments // parse comments and add them to AST - Trace // print a trace of parsed productions - DeclarationErrors // report declaration errors -) - -// The parser structure holds the parser's internal state. -type parser struct { - file *token.File - scanner.ErrorVector - scanner scanner.Scanner - - // Tracing/debugging - mode uint // parsing mode - trace bool // == (mode & Trace != 0) - indent uint // indentation used for tracing output - - // Comments - comments []*ast.CommentGroup - leadComment *ast.CommentGroup // last lead comment - lineComment *ast.CommentGroup // last line comment - - // Next token - pos token.Pos // token position - tok token.Token // one token look-ahead - lit string // token literal - - // Non-syntactic parser control - exprLev int // < 0: in control clause, >= 0: in expression - - // Ordinary identifier scopes - pkgScope *ast.Scope // pkgScope.Outer == nil - topScope *ast.Scope // top-most scope; may be pkgScope - unresolved []*ast.Ident // unresolved identifiers - imports []*ast.ImportSpec // list of imports - - // Label scope - // (maintained by open/close LabelScope) - labelScope *ast.Scope // label scope for current function - targetStack [][]*ast.Ident // stack of unresolved labels -} - -// scannerMode returns the scanner mode bits given the parser's mode bits. -func scannerMode(mode uint) uint { - var m uint = scanner.InsertSemis - if mode&ParseComments != 0 { - m |= scanner.ScanComments - } - return m -} - -func (p *parser) init(fset *token.FileSet, filename string, src []byte, mode uint) { - p.file = fset.AddFile(filename, fset.Base(), len(src)) - p.scanner.Init(p.file, src, p, scannerMode(mode)) - - p.mode = mode - p.trace = mode&Trace != 0 // for convenience (p.trace is used frequently) - - p.next() - - // set up the pkgScope here (as opposed to in parseFile) because - // there are other parser entry points (ParseExpr, etc.) - p.openScope() - p.pkgScope = p.topScope - - // for the same reason, set up a label scope - p.openLabelScope() -} - -// ---------------------------------------------------------------------------- -// Scoping support - -func (p *parser) openScope() { - p.topScope = ast.NewScope(p.topScope) -} - -func (p *parser) closeScope() { - p.topScope = p.topScope.Outer -} - -func (p *parser) openLabelScope() { - p.labelScope = ast.NewScope(p.labelScope) - p.targetStack = append(p.targetStack, nil) -} - -func (p *parser) closeLabelScope() { - // resolve labels - n := len(p.targetStack) - 1 - scope := p.labelScope - for _, ident := range p.targetStack[n] { - ident.Obj = scope.Lookup(ident.Name) - if ident.Obj == nil && p.mode&DeclarationErrors != 0 { - p.error(ident.Pos(), fmt.Sprintf("label %s undefined", ident.Name)) - } - } - // pop label scope - p.targetStack = p.targetStack[0:n] - p.labelScope = p.labelScope.Outer -} - -func (p *parser) declare(decl interface{}, scope *ast.Scope, kind ast.ObjKind, idents ...*ast.Ident) { - for _, ident := range idents { - assert(ident.Obj == nil, "identifier already declared or resolved") - if ident.Name != "_" { - obj := ast.NewObj(kind, ident.Name) - // remember the corresponding declaration for redeclaration - // errors and global variable resolution/typechecking phase - obj.Decl = decl - if alt := scope.Insert(obj); alt != nil && p.mode&DeclarationErrors != 0 { - prevDecl := "" - if pos := alt.Pos(); pos.IsValid() { - prevDecl = fmt.Sprintf("\n\tprevious declaration at %s", p.file.Position(pos)) - } - p.error(ident.Pos(), fmt.Sprintf("%s redeclared in this block%s", ident.Name, prevDecl)) - } - ident.Obj = obj - } - } -} - -func (p *parser) shortVarDecl(idents []*ast.Ident) { - // Go spec: A short variable declaration may redeclare variables - // provided they were originally declared in the same block with - // the same type, and at least one of the non-blank variables is new. - n := 0 // number of new variables - for _, ident := range idents { - assert(ident.Obj == nil, "identifier already declared or resolved") - if ident.Name != "_" { - obj := ast.NewObj(ast.Var, ident.Name) - // short var declarations cannot have redeclaration errors - // and are not global => no need to remember the respective - // declaration - alt := p.topScope.Insert(obj) - if alt == nil { - n++ // new declaration - alt = obj - } - ident.Obj = alt - } - } - if n == 0 && p.mode&DeclarationErrors != 0 { - p.error(idents[0].Pos(), "no new variables on left side of :=") - } -} - -// The unresolved object is a sentinel to mark identifiers that have been added -// to the list of unresolved identifiers. The sentinel is only used for verifying -// internal consistency. -var unresolved = new(ast.Object) - -func (p *parser) resolve(x ast.Expr) { - // nothing to do if x is not an identifier or the blank identifier - ident, _ := x.(*ast.Ident) - if ident == nil { - return - } - assert(ident.Obj == nil, "identifier already declared or resolved") - if ident.Name == "_" { - return - } - // try to resolve the identifier - for s := p.topScope; s != nil; s = s.Outer { - if obj := s.Lookup(ident.Name); obj != nil { - ident.Obj = obj - return - } - } - // all local scopes are known, so any unresolved identifier - // must be found either in the file scope, package scope - // (perhaps in another file), or universe scope --- collect - // them so that they can be resolved later - ident.Obj = unresolved - p.unresolved = append(p.unresolved, ident) -} - -// ---------------------------------------------------------------------------- -// Parsing support - -func (p *parser) printTrace(a ...interface{}) { - const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + - ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " - const n = uint(len(dots)) - pos := p.file.Position(p.pos) - fmt.Printf("%5d:%3d: ", pos.Line, pos.Column) - i := 2 * p.indent - for ; i > n; i -= n { - fmt.Print(dots) - } - fmt.Print(dots[0:i]) - fmt.Println(a...) -} - -func trace(p *parser, msg string) *parser { - p.printTrace(msg, "(") - p.indent++ - return p -} - -// Usage pattern: defer un(trace(p, "...")); -func un(p *parser) { - p.indent-- - p.printTrace(")") -} - -// Advance to the next token. -func (p *parser) next0() { - // Because of one-token look-ahead, print the previous token - // when tracing as it provides a more readable output. The - // very first token (!p.pos.IsValid()) is not initialized - // (it is token.ILLEGAL), so don't print it. - if p.trace && p.pos.IsValid() { - s := p.tok.String() - switch { - case p.tok.IsLiteral(): - p.printTrace(s, p.lit) - case p.tok.IsOperator(), p.tok.IsKeyword(): - p.printTrace("\"" + s + "\"") - default: - p.printTrace(s) - } - } - - p.pos, p.tok, p.lit = p.scanner.Scan() -} - -// Consume a comment and return it and the line on which it ends. -func (p *parser) consumeComment() (comment *ast.Comment, endline int) { - // /*-style comments may end on a different line than where they start. - // Scan the comment for '\n' chars and adjust endline accordingly. - endline = p.file.Line(p.pos) - if p.lit[1] == '*' { - // don't use range here - no need to decode Unicode code points - for i := 0; i < len(p.lit); i++ { - if p.lit[i] == '\n' { - endline++ - } - } - } - - comment = &ast.Comment{p.pos, p.lit} - p.next0() - - return -} - -// Consume a group of adjacent comments, add it to the parser's -// comments list, and return it together with the line at which -// the last comment in the group ends. An empty line or non-comment -// token terminates a comment group. -func (p *parser) consumeCommentGroup() (comments *ast.CommentGroup, endline int) { - var list []*ast.Comment - endline = p.file.Line(p.pos) - for p.tok == token.COMMENT && endline+1 >= p.file.Line(p.pos) { - var comment *ast.Comment - comment, endline = p.consumeComment() - list = append(list, comment) - } - - // add comment group to the comments list - comments = &ast.CommentGroup{list} - p.comments = append(p.comments, comments) - - return -} - -// Advance to the next non-comment token. In the process, collect -// any comment groups encountered, and remember the last lead and -// line comments. -// -// A lead comment is a comment group that starts and ends in a -// line without any other tokens and that is followed by a non-comment -// token on the line immediately after the comment group. -// -// A line comment is a comment group that follows a non-comment -// token on the same line, and that has no tokens after it on the line -// where it ends. -// -// Lead and line comments may be considered documentation that is -// stored in the AST. -func (p *parser) next() { - p.leadComment = nil - p.lineComment = nil - line := p.file.Line(p.pos) // current line - p.next0() - - if p.tok == token.COMMENT { - var comment *ast.CommentGroup - var endline int - - if p.file.Line(p.pos) == line { - // The comment is on same line as the previous token; it - // cannot be a lead comment but may be a line comment. - comment, endline = p.consumeCommentGroup() - if p.file.Line(p.pos) != endline { - // The next token is on a different line, thus - // the last comment group is a line comment. - p.lineComment = comment - } - } - - // consume successor comments, if any - endline = -1 - for p.tok == token.COMMENT { - comment, endline = p.consumeCommentGroup() - } - - if endline+1 == p.file.Line(p.pos) { - // The next token is following on the line immediately after the - // comment group, thus the last comment group is a lead comment. - p.leadComment = comment - } - } -} - -func (p *parser) error(pos token.Pos, msg string) { - p.Error(p.file.Position(pos), msg) -} - -func (p *parser) errorExpected(pos token.Pos, msg string) { - msg = "expected " + msg - if pos == p.pos { - // the error happened at the current position; - // make the error message more specific - if p.tok == token.SEMICOLON && p.lit[0] == '\n' { - msg += ", found newline" - } else { - msg += ", found '" + p.tok.String() + "'" - if p.tok.IsLiteral() { - msg += " " + p.lit - } - } - } - p.error(pos, msg) -} - -func (p *parser) expect(tok token.Token) token.Pos { - pos := p.pos - if p.tok != tok { - p.errorExpected(pos, "'"+tok.String()+"'") - } - p.next() // make progress - return pos -} - -func (p *parser) expectSemi() { - if p.tok != token.RPAREN && p.tok != token.RBRACE { - p.expect(token.SEMICOLON) - } -} - -func assert(cond bool, msg string) { - if !cond { - panic("go/parser internal error: " + msg) - } -} - -// ---------------------------------------------------------------------------- -// Identifiers - -func (p *parser) parseIdent() *ast.Ident { - pos := p.pos - name := "_" - if p.tok == token.IDENT { - name = p.lit - p.next() - } else { - p.expect(token.IDENT) // use expect() error handling - } - return &ast.Ident{pos, name, nil} -} - -func (p *parser) parseIdentList() (list []*ast.Ident) { - if p.trace { - defer un(trace(p, "IdentList")) - } - - list = append(list, p.parseIdent()) - for p.tok == token.COMMA { - p.next() - list = append(list, p.parseIdent()) - } - - return -} - -// ---------------------------------------------------------------------------- -// Common productions - -// If lhs is set, result list elements which are identifiers are not resolved. -func (p *parser) parseExprList(lhs bool) (list []ast.Expr) { - if p.trace { - defer un(trace(p, "ExpressionList")) - } - - list = append(list, p.parseExpr(lhs)) - for p.tok == token.COMMA { - p.next() - list = append(list, p.parseExpr(lhs)) - } - - return -} - -func (p *parser) parseLhsList() []ast.Expr { - list := p.parseExprList(true) - switch p.tok { - case token.DEFINE: - // lhs of a short variable declaration - p.shortVarDecl(p.makeIdentList(list)) - case token.COLON: - // lhs of a label declaration or a communication clause of a select - // statement (parseLhsList is not called when parsing the case clause - // of a switch statement): - // - labels are declared by the caller of parseLhsList - // - for communication clauses, if there is a stand-alone identifier - // followed by a colon, we have a syntax error; there is no need - // to resolve the identifier in that case - default: - // identifiers must be declared elsewhere - for _, x := range list { - p.resolve(x) - } - } - return list -} - -func (p *parser) parseRhsList() []ast.Expr { - return p.parseExprList(false) -} - -// ---------------------------------------------------------------------------- -// Types - -func (p *parser) parseType() ast.Expr { - if p.trace { - defer un(trace(p, "Type")) - } - - typ := p.tryType() - - if typ == nil { - pos := p.pos - p.errorExpected(pos, "type") - p.next() // make progress - return &ast.BadExpr{pos, p.pos} - } - - return typ -} - -// If the result is an identifier, it is not resolved. -func (p *parser) parseTypeName() ast.Expr { - if p.trace { - defer un(trace(p, "TypeName")) - } - - ident := p.parseIdent() - // don't resolve ident yet - it may be a parameter or field name - - if p.tok == token.PERIOD { - // ident is a package name - p.next() - p.resolve(ident) - sel := p.parseIdent() - return &ast.SelectorExpr{ident, sel} - } - - return ident -} - -func (p *parser) parseArrayType(ellipsisOk bool) ast.Expr { - if p.trace { - defer un(trace(p, "ArrayType")) - } - - lbrack := p.expect(token.LBRACK) - var len ast.Expr - if ellipsisOk && p.tok == token.ELLIPSIS { - len = &ast.Ellipsis{p.pos, nil} - p.next() - } else if p.tok != token.RBRACK { - len = p.parseRhs() - } - p.expect(token.RBRACK) - elt := p.parseType() - - return &ast.ArrayType{lbrack, len, elt} -} - -func (p *parser) makeIdentList(list []ast.Expr) []*ast.Ident { - idents := make([]*ast.Ident, len(list)) - for i, x := range list { - ident, isIdent := x.(*ast.Ident) - if !isIdent { - pos := x.(ast.Expr).Pos() - p.errorExpected(pos, "identifier") - ident = &ast.Ident{pos, "_", nil} - } - idents[i] = ident - } - return idents -} - -func (p *parser) parseFieldDecl(scope *ast.Scope) *ast.Field { - if p.trace { - defer un(trace(p, "FieldDecl")) - } - - doc := p.leadComment - - // fields - list, typ := p.parseVarList(false) - - // optional tag - var tag *ast.BasicLit - if p.tok == token.STRING { - tag = &ast.BasicLit{p.pos, p.tok, p.lit} - p.next() - } - - // analyze case - var idents []*ast.Ident - if typ != nil { - // IdentifierList Type - idents = p.makeIdentList(list) - } else { - // ["*"] TypeName (AnonymousField) - typ = list[0] // we always have at least one element - p.resolve(typ) - if n := len(list); n > 1 || !isTypeName(deref(typ)) { - pos := typ.Pos() - p.errorExpected(pos, "anonymous field") - typ = &ast.BadExpr{pos, list[n-1].End()} - } - } - - p.expectSemi() // call before accessing p.linecomment - - field := &ast.Field{doc, idents, typ, tag, p.lineComment} - p.declare(field, scope, ast.Var, idents...) - - return field -} - -func (p *parser) parseStructType() *ast.StructType { - if p.trace { - defer un(trace(p, "StructType")) - } - - pos := p.expect(token.STRUCT) - lbrace := p.expect(token.LBRACE) - scope := ast.NewScope(nil) // struct scope - var list []*ast.Field - for p.tok == token.IDENT || p.tok == token.MUL || p.tok == token.LPAREN { - // a field declaration cannot start with a '(' but we accept - // it here for more robust parsing and better error messages - // (parseFieldDecl will check and complain if necessary) - list = append(list, p.parseFieldDecl(scope)) - } - rbrace := p.expect(token.RBRACE) - - // TODO(gri): store struct scope in AST - return &ast.StructType{pos, &ast.FieldList{lbrace, list, rbrace}, false} -} - -func (p *parser) parsePointerType() *ast.StarExpr { - if p.trace { - defer un(trace(p, "PointerType")) - } - - star := p.expect(token.MUL) - base := p.parseType() - - return &ast.StarExpr{star, base} -} - -func (p *parser) tryVarType(isParam bool) ast.Expr { - if isParam && p.tok == token.ELLIPSIS { - pos := p.pos - p.next() - typ := p.tryIdentOrType(isParam) // don't use parseType so we can provide better error message - if typ == nil { - p.error(pos, "'...' parameter is missing type") - typ = &ast.BadExpr{pos, p.pos} - } - if p.tok != token.RPAREN { - p.error(pos, "can use '...' with last parameter type only") - } - return &ast.Ellipsis{pos, typ} - } - return p.tryIdentOrType(false) -} - -func (p *parser) parseVarType(isParam bool) ast.Expr { - typ := p.tryVarType(isParam) - if typ == nil { - pos := p.pos - p.errorExpected(pos, "type") - p.next() // make progress - typ = &ast.BadExpr{pos, p.pos} - } - return typ -} - -func (p *parser) parseVarList(isParam bool) (list []ast.Expr, typ ast.Expr) { - if p.trace { - defer un(trace(p, "VarList")) - } - - // a list of identifiers looks like a list of type names - for { - // parseVarType accepts any type (including parenthesized ones) - // even though the syntax does not permit them here: we - // accept them all for more robust parsing and complain - // afterwards - list = append(list, p.parseVarType(isParam)) - if p.tok != token.COMMA { - break - } - p.next() - } - - // if we had a list of identifiers, it must be followed by a type - typ = p.tryVarType(isParam) - if typ != nil { - p.resolve(typ) - } - - return -} - -func (p *parser) parseParameterList(scope *ast.Scope, ellipsisOk bool) (params []*ast.Field) { - if p.trace { - defer un(trace(p, "ParameterList")) - } - - list, typ := p.parseVarList(ellipsisOk) - if typ != nil { - // IdentifierList Type - idents := p.makeIdentList(list) - field := &ast.Field{nil, idents, typ, nil, nil} - params = append(params, field) - // Go spec: The scope of an identifier denoting a function - // parameter or result variable is the function body. - p.declare(field, scope, ast.Var, idents...) - if p.tok == token.COMMA { - p.next() - } - - for p.tok != token.RPAREN && p.tok != token.EOF { - idents := p.parseIdentList() - typ := p.parseVarType(ellipsisOk) - field := &ast.Field{nil, idents, typ, nil, nil} - params = append(params, field) - // Go spec: The scope of an identifier denoting a function - // parameter or result variable is the function body. - p.declare(field, scope, ast.Var, idents...) - if p.tok != token.COMMA { - break - } - p.next() - } - - } else { - // Type { "," Type } (anonymous parameters) - params = make([]*ast.Field, len(list)) - for i, x := range list { - p.resolve(x) - params[i] = &ast.Field{Type: x} - } - } - - return -} - -func (p *parser) parseParameters(scope *ast.Scope, ellipsisOk bool) *ast.FieldList { - if p.trace { - defer un(trace(p, "Parameters")) - } - - var params []*ast.Field - lparen := p.expect(token.LPAREN) - if p.tok != token.RPAREN { - params = p.parseParameterList(scope, ellipsisOk) - } - rparen := p.expect(token.RPAREN) - - return &ast.FieldList{lparen, params, rparen} -} - -func (p *parser) parseResult(scope *ast.Scope) *ast.FieldList { - if p.trace { - defer un(trace(p, "Result")) - } - - if p.tok == token.LPAREN { - return p.parseParameters(scope, false) - } - - typ := p.tryType() - if typ != nil { - list := make([]*ast.Field, 1) - list[0] = &ast.Field{Type: typ} - return &ast.FieldList{List: list} - } - - return nil -} - -func (p *parser) parseSignature(scope *ast.Scope) (params, results *ast.FieldList) { - if p.trace { - defer un(trace(p, "Signature")) - } - - params = p.parseParameters(scope, true) - results = p.parseResult(scope) - - return -} - -func (p *parser) parseFuncType() (*ast.FuncType, *ast.Scope) { - if p.trace { - defer un(trace(p, "FuncType")) - } - - pos := p.expect(token.FUNC) - scope := ast.NewScope(p.topScope) // function scope - params, results := p.parseSignature(scope) - - return &ast.FuncType{pos, params, results}, scope -} - -func (p *parser) parseMethodSpec(scope *ast.Scope) *ast.Field { - if p.trace { - defer un(trace(p, "MethodSpec")) - } - - doc := p.leadComment - var idents []*ast.Ident - var typ ast.Expr - x := p.parseTypeName() - if ident, isIdent := x.(*ast.Ident); isIdent && p.tok == token.LPAREN { - // method - idents = []*ast.Ident{ident} - scope := ast.NewScope(nil) // method scope - params, results := p.parseSignature(scope) - typ = &ast.FuncType{token.NoPos, params, results} - } else { - // embedded interface - typ = x - } - p.expectSemi() // call before accessing p.linecomment - - spec := &ast.Field{doc, idents, typ, nil, p.lineComment} - p.declare(spec, scope, ast.Fun, idents...) - - return spec -} - -func (p *parser) parseInterfaceType() *ast.InterfaceType { - if p.trace { - defer un(trace(p, "InterfaceType")) - } - - pos := p.expect(token.INTERFACE) - lbrace := p.expect(token.LBRACE) - scope := ast.NewScope(nil) // interface scope - var list []*ast.Field - for p.tok == token.IDENT { - list = append(list, p.parseMethodSpec(scope)) - } - rbrace := p.expect(token.RBRACE) - - // TODO(gri): store interface scope in AST - return &ast.InterfaceType{pos, &ast.FieldList{lbrace, list, rbrace}, false} -} - -func (p *parser) parseMapType() *ast.MapType { - if p.trace { - defer un(trace(p, "MapType")) - } - - pos := p.expect(token.MAP) - p.expect(token.LBRACK) - key := p.parseType() - p.expect(token.RBRACK) - value := p.parseType() - - return &ast.MapType{pos, key, value} -} - -func (p *parser) parseChanType() *ast.ChanType { - if p.trace { - defer un(trace(p, "ChanType")) - } - - pos := p.pos - dir := ast.SEND | ast.RECV - if p.tok == token.CHAN { - p.next() - if p.tok == token.ARROW { - p.next() - dir = ast.SEND - } - } else { - p.expect(token.ARROW) - p.expect(token.CHAN) - dir = ast.RECV - } - value := p.parseType() - - return &ast.ChanType{pos, dir, value} -} - -// If the result is an identifier, it is not resolved. -func (p *parser) tryIdentOrType(ellipsisOk bool) ast.Expr { - switch p.tok { - case token.IDENT: - return p.parseTypeName() - case token.LBRACK: - return p.parseArrayType(ellipsisOk) - case token.STRUCT: - return p.parseStructType() - case token.MUL: - return p.parsePointerType() - case token.FUNC: - typ, _ := p.parseFuncType() - return typ - case token.INTERFACE: - return p.parseInterfaceType() - case token.MAP: - return p.parseMapType() - case token.CHAN, token.ARROW: - return p.parseChanType() - case token.LPAREN: - lparen := p.pos - p.next() - typ := p.parseType() - rparen := p.expect(token.RPAREN) - return &ast.ParenExpr{lparen, typ, rparen} - } - - // no type found - return nil -} - -func (p *parser) tryType() ast.Expr { - typ := p.tryIdentOrType(false) - if typ != nil { - p.resolve(typ) - } - return typ -} - -// ---------------------------------------------------------------------------- -// Blocks - -func (p *parser) parseStmtList() (list []ast.Stmt) { - if p.trace { - defer un(trace(p, "StatementList")) - } - - for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF { - list = append(list, p.parseStmt()) - } - - return -} - -func (p *parser) parseBody(scope *ast.Scope) *ast.BlockStmt { - if p.trace { - defer un(trace(p, "Body")) - } - - lbrace := p.expect(token.LBRACE) - p.topScope = scope // open function scope - p.openLabelScope() - list := p.parseStmtList() - p.closeLabelScope() - p.closeScope() - rbrace := p.expect(token.RBRACE) - - return &ast.BlockStmt{lbrace, list, rbrace} -} - -func (p *parser) parseBlockStmt() *ast.BlockStmt { - if p.trace { - defer un(trace(p, "BlockStmt")) - } - - lbrace := p.expect(token.LBRACE) - p.openScope() - list := p.parseStmtList() - p.closeScope() - rbrace := p.expect(token.RBRACE) - - return &ast.BlockStmt{lbrace, list, rbrace} -} - -// ---------------------------------------------------------------------------- -// Expressions - -func (p *parser) parseFuncTypeOrLit() ast.Expr { - if p.trace { - defer un(trace(p, "FuncTypeOrLit")) - } - - typ, scope := p.parseFuncType() - if p.tok != token.LBRACE { - // function type only - return typ - } - - p.exprLev++ - body := p.parseBody(scope) - p.exprLev-- - - return &ast.FuncLit{typ, body} -} - -// parseOperand may return an expression or a raw type (incl. array -// types of the form [...]T. Callers must verify the result. -// If lhs is set and the result is an identifier, it is not resolved. -func (p *parser) parseOperand(lhs bool) ast.Expr { - if p.trace { - defer un(trace(p, "Operand")) - } - - switch p.tok { - case token.IDENT: - x := p.parseIdent() - if !lhs { - p.resolve(x) - } - return x - - case token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING: - x := &ast.BasicLit{p.pos, p.tok, p.lit} - p.next() - return x - - case token.LPAREN: - lparen := p.pos - p.next() - p.exprLev++ - x := p.parseRhs() - p.exprLev-- - rparen := p.expect(token.RPAREN) - return &ast.ParenExpr{lparen, x, rparen} - - case token.FUNC: - return p.parseFuncTypeOrLit() - - default: - if typ := p.tryIdentOrType(true); typ != nil { - // could be type for composite literal or conversion - _, isIdent := typ.(*ast.Ident) - assert(!isIdent, "type cannot be identifier") - return typ - } - } - - pos := p.pos - p.errorExpected(pos, "operand") - p.next() // make progress - return &ast.BadExpr{pos, p.pos} -} - -func (p *parser) parseSelector(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "Selector")) - } - - sel := p.parseIdent() - - return &ast.SelectorExpr{x, sel} -} - -func (p *parser) parseTypeAssertion(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "TypeAssertion")) - } - - p.expect(token.LPAREN) - var typ ast.Expr - if p.tok == token.TYPE { - // type switch: typ == nil - p.next() - } else { - typ = p.parseType() - } - p.expect(token.RPAREN) - - return &ast.TypeAssertExpr{x, typ} -} - -func (p *parser) parseIndexOrSlice(x ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "IndexOrSlice")) - } - - lbrack := p.expect(token.LBRACK) - p.exprLev++ - var low, high ast.Expr - isSlice := false - if p.tok != token.COLON { - low = p.parseRhs() - } - if p.tok == token.COLON { - isSlice = true - p.next() - if p.tok != token.RBRACK { - high = p.parseRhs() - } - } - p.exprLev-- - rbrack := p.expect(token.RBRACK) - - if isSlice { - return &ast.SliceExpr{x, lbrack, low, high, rbrack} - } - return &ast.IndexExpr{x, lbrack, low, rbrack} -} - -func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr { - if p.trace { - defer un(trace(p, "CallOrConversion")) - } - - lparen := p.expect(token.LPAREN) - p.exprLev++ - var list []ast.Expr - var ellipsis token.Pos - for p.tok != token.RPAREN && p.tok != token.EOF && !ellipsis.IsValid() { - list = append(list, p.parseRhs()) - if p.tok == token.ELLIPSIS { - ellipsis = p.pos - p.next() - } - if p.tok != token.COMMA { - break - } - p.next() - } - p.exprLev-- - rparen := p.expect(token.RPAREN) - - return &ast.CallExpr{fun, lparen, list, ellipsis, rparen} -} - -func (p *parser) parseElement(keyOk bool) ast.Expr { - if p.trace { - defer un(trace(p, "Element")) - } - - if p.tok == token.LBRACE { - return p.parseLiteralValue(nil) - } - - x := p.parseExpr(keyOk) // don't resolve if map key - if keyOk { - if p.tok == token.COLON { - colon := p.pos - p.next() - return &ast.KeyValueExpr{x, colon, p.parseElement(false)} - } - p.resolve(x) // not a map key - } - - return x -} - -func (p *parser) parseElementList() (list []ast.Expr) { - if p.trace { - defer un(trace(p, "ElementList")) - } - - for p.tok != token.RBRACE && p.tok != token.EOF { - list = append(list, p.parseElement(true)) - if p.tok != token.COMMA { - break - } - p.next() - } - - return -} - -func (p *parser) parseLiteralValue(typ ast.Expr) ast.Expr { - if p.trace { - defer un(trace(p, "LiteralValue")) - } - - lbrace := p.expect(token.LBRACE) - var elts []ast.Expr - p.exprLev++ - if p.tok != token.RBRACE { - elts = p.parseElementList() - } - p.exprLev-- - rbrace := p.expect(token.RBRACE) - return &ast.CompositeLit{typ, lbrace, elts, rbrace} -} - -// checkExpr checks that x is an expression (and not a type). -func (p *parser) checkExpr(x ast.Expr) ast.Expr { - switch t := unparen(x).(type) { - case *ast.BadExpr: - case *ast.Ident: - case *ast.BasicLit: - case *ast.FuncLit: - case *ast.CompositeLit: - case *ast.ParenExpr: - panic("unreachable") - case *ast.SelectorExpr: - case *ast.IndexExpr: - case *ast.SliceExpr: - case *ast.TypeAssertExpr: - if t.Type == nil { - // the form X.(type) is only allowed in type switch expressions - p.errorExpected(x.Pos(), "expression") - x = &ast.BadExpr{x.Pos(), x.End()} - } - case *ast.CallExpr: - case *ast.StarExpr: - case *ast.UnaryExpr: - if t.Op == token.RANGE { - // the range operator is only allowed at the top of a for statement - p.errorExpected(x.Pos(), "expression") - x = &ast.BadExpr{x.Pos(), x.End()} - } - case *ast.BinaryExpr: - default: - // all other nodes are not proper expressions - p.errorExpected(x.Pos(), "expression") - x = &ast.BadExpr{x.Pos(), x.End()} - } - return x -} - -// isTypeName reports whether x is a (qualified) TypeName. -func isTypeName(x ast.Expr) bool { - switch t := x.(type) { - case *ast.BadExpr: - case *ast.Ident: - case *ast.SelectorExpr: - _, isIdent := t.X.(*ast.Ident) - return isIdent - default: - return false // all other nodes are not type names - } - return true -} - -// isLiteralType reports whether x is a legal composite literal type. -func isLiteralType(x ast.Expr) bool { - switch t := x.(type) { - case *ast.BadExpr: - case *ast.Ident: - case *ast.SelectorExpr: - _, isIdent := t.X.(*ast.Ident) - return isIdent - case *ast.ArrayType: - case *ast.StructType: - case *ast.MapType: - default: - return false // all other nodes are not legal composite literal types - } - return true -} - -// If x is of the form *T, deref returns T, otherwise it returns x. -func deref(x ast.Expr) ast.Expr { - if p, isPtr := x.(*ast.StarExpr); isPtr { - x = p.X - } - return x -} - -// If x is of the form (T), unparen returns unparen(T), otherwise it returns x. -func unparen(x ast.Expr) ast.Expr { - if p, isParen := x.(*ast.ParenExpr); isParen { - x = unparen(p.X) - } - return x -} - -// checkExprOrType checks that x is an expression or a type -// (and not a raw type such as [...]T). -func (p *parser) checkExprOrType(x ast.Expr) ast.Expr { - switch t := unparen(x).(type) { - case *ast.ParenExpr: - panic("unreachable") - case *ast.UnaryExpr: - if t.Op == token.RANGE { - // the range operator is only allowed at the top of a for statement - p.errorExpected(x.Pos(), "expression") - x = &ast.BadExpr{x.Pos(), x.End()} - } - case *ast.ArrayType: - if len, isEllipsis := t.Len.(*ast.Ellipsis); isEllipsis { - p.error(len.Pos(), "expected array length, found '...'") - x = &ast.BadExpr{x.Pos(), x.End()} - } - } - - // all other nodes are expressions or types - return x -} - -// If lhs is set and the result is an identifier, it is not resolved. -func (p *parser) parsePrimaryExpr(lhs bool) ast.Expr { - if p.trace { - defer un(trace(p, "PrimaryExpr")) - } - - x := p.parseOperand(lhs) -L: - for { - switch p.tok { - case token.PERIOD: - p.next() - if lhs { - p.resolve(x) - } - switch p.tok { - case token.IDENT: - x = p.parseSelector(p.checkExpr(x)) - case token.LPAREN: - x = p.parseTypeAssertion(p.checkExpr(x)) - default: - pos := p.pos - p.next() // make progress - p.errorExpected(pos, "selector or type assertion") - x = &ast.BadExpr{pos, p.pos} - } - case token.LBRACK: - if lhs { - p.resolve(x) - } - x = p.parseIndexOrSlice(p.checkExpr(x)) - case token.LPAREN: - if lhs { - p.resolve(x) - } - x = p.parseCallOrConversion(p.checkExprOrType(x)) - case token.LBRACE: - if isLiteralType(x) && (p.exprLev >= 0 || !isTypeName(x)) { - if lhs { - p.resolve(x) - } - x = p.parseLiteralValue(x) - } else { - break L - } - default: - break L - } - lhs = false // no need to try to resolve again - } - - return x -} - -// If lhs is set and the result is an identifier, it is not resolved. -func (p *parser) parseUnaryExpr(lhs bool) ast.Expr { - if p.trace { - defer un(trace(p, "UnaryExpr")) - } - - switch p.tok { - case token.ADD, token.SUB, token.NOT, token.XOR, token.AND, token.RANGE: - pos, op := p.pos, p.tok - p.next() - x := p.parseUnaryExpr(false) - return &ast.UnaryExpr{pos, op, p.checkExpr(x)} - - case token.ARROW: - // channel type or receive expression - pos := p.pos - p.next() - if p.tok == token.CHAN { - p.next() - value := p.parseType() - return &ast.ChanType{pos, ast.RECV, value} - } - - x := p.parseUnaryExpr(false) - return &ast.UnaryExpr{pos, token.ARROW, p.checkExpr(x)} - - case token.MUL: - // pointer type or unary "*" expression - pos := p.pos - p.next() - x := p.parseUnaryExpr(false) - return &ast.StarExpr{pos, p.checkExprOrType(x)} - } - - return p.parsePrimaryExpr(lhs) -} - -// If lhs is set and the result is an identifier, it is not resolved. -func (p *parser) parseBinaryExpr(lhs bool, prec1 int) ast.Expr { - if p.trace { - defer un(trace(p, "BinaryExpr")) - } - - x := p.parseUnaryExpr(lhs) - for prec := p.tok.Precedence(); prec >= prec1; prec-- { - for p.tok.Precedence() == prec { - pos, op := p.pos, p.tok - p.next() - if lhs { - p.resolve(x) - lhs = false - } - y := p.parseBinaryExpr(false, prec+1) - x = &ast.BinaryExpr{p.checkExpr(x), pos, op, p.checkExpr(y)} - } - } - - return x -} - -// If lhs is set and the result is an identifier, it is not resolved. -// TODO(gri): parseExpr may return a type or even a raw type ([..]int) - -// should reject when a type/raw type is obviously not allowed -func (p *parser) parseExpr(lhs bool) ast.Expr { - if p.trace { - defer un(trace(p, "Expression")) - } - - return p.parseBinaryExpr(lhs, token.LowestPrec+1) -} - -func (p *parser) parseRhs() ast.Expr { - return p.parseExpr(false) -} - -// ---------------------------------------------------------------------------- -// Statements - -func (p *parser) parseSimpleStmt(labelOk bool) ast.Stmt { - if p.trace { - defer un(trace(p, "SimpleStmt")) - } - - x := p.parseLhsList() - - switch p.tok { - case - token.DEFINE, token.ASSIGN, token.ADD_ASSIGN, - token.SUB_ASSIGN, token.MUL_ASSIGN, token.QUO_ASSIGN, - token.REM_ASSIGN, token.AND_ASSIGN, token.OR_ASSIGN, - token.XOR_ASSIGN, token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN: - // assignment statement - pos, tok := p.pos, p.tok - p.next() - y := p.parseRhsList() - return &ast.AssignStmt{x, pos, tok, y} - } - - if len(x) > 1 { - p.errorExpected(x[0].Pos(), "1 expression") - // continue with first expression - } - - switch p.tok { - case token.COLON: - // labeled statement - colon := p.pos - p.next() - if label, isIdent := x[0].(*ast.Ident); labelOk && isIdent { - // Go spec: The scope of a label is the body of the function - // in which it is declared and excludes the body of any nested - // function. - stmt := &ast.LabeledStmt{label, colon, p.parseStmt()} - p.declare(stmt, p.labelScope, ast.Lbl, label) - return stmt - } - p.error(x[0].Pos(), "illegal label declaration") - return &ast.BadStmt{x[0].Pos(), colon + 1} - - case token.ARROW: - // send statement - arrow := p.pos - p.next() // consume "<-" - y := p.parseRhs() - return &ast.SendStmt{x[0], arrow, y} - - case token.INC, token.DEC: - // increment or decrement - s := &ast.IncDecStmt{x[0], p.pos, p.tok} - p.next() // consume "++" or "--" - return s - } - - // expression - return &ast.ExprStmt{x[0]} -} - -func (p *parser) parseCallExpr() *ast.CallExpr { - x := p.parseRhs() - if call, isCall := x.(*ast.CallExpr); isCall { - return call - } - p.errorExpected(x.Pos(), "function/method call") - return nil -} - -func (p *parser) parseGoStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "GoStmt")) - } - - pos := p.expect(token.GO) - call := p.parseCallExpr() - p.expectSemi() - if call == nil { - return &ast.BadStmt{pos, pos + 2} // len("go") - } - - return &ast.GoStmt{pos, call} -} - -func (p *parser) parseDeferStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "DeferStmt")) - } - - pos := p.expect(token.DEFER) - call := p.parseCallExpr() - p.expectSemi() - if call == nil { - return &ast.BadStmt{pos, pos + 5} // len("defer") - } - - return &ast.DeferStmt{pos, call} -} - -func (p *parser) parseReturnStmt() *ast.ReturnStmt { - if p.trace { - defer un(trace(p, "ReturnStmt")) - } - - pos := p.pos - p.expect(token.RETURN) - var x []ast.Expr - if p.tok != token.SEMICOLON && p.tok != token.RBRACE { - x = p.parseRhsList() - } - p.expectSemi() - - return &ast.ReturnStmt{pos, x} -} - -func (p *parser) parseBranchStmt(tok token.Token) *ast.BranchStmt { - if p.trace { - defer un(trace(p, "BranchStmt")) - } - - pos := p.expect(tok) - var label *ast.Ident - if tok != token.FALLTHROUGH && p.tok == token.IDENT { - label = p.parseIdent() - // add to list of unresolved targets - n := len(p.targetStack) - 1 - p.targetStack[n] = append(p.targetStack[n], label) - } - p.expectSemi() - - return &ast.BranchStmt{pos, tok, label} -} - -func (p *parser) makeExpr(s ast.Stmt) ast.Expr { - if s == nil { - return nil - } - if es, isExpr := s.(*ast.ExprStmt); isExpr { - return p.checkExpr(es.X) - } - p.error(s.Pos(), "expected condition, found simple statement") - return &ast.BadExpr{s.Pos(), s.End()} -} - -func (p *parser) parseIfStmt() *ast.IfStmt { - if p.trace { - defer un(trace(p, "IfStmt")) - } - - pos := p.expect(token.IF) - p.openScope() - defer p.closeScope() - - var s ast.Stmt - var x ast.Expr - { - prevLev := p.exprLev - p.exprLev = -1 - if p.tok == token.SEMICOLON { - p.next() - x = p.parseRhs() - } else { - s = p.parseSimpleStmt(false) - if p.tok == token.SEMICOLON { - p.next() - x = p.parseRhs() - } else { - x = p.makeExpr(s) - s = nil - } - } - p.exprLev = prevLev - } - - body := p.parseBlockStmt() - var else_ ast.Stmt - if p.tok == token.ELSE { - p.next() - else_ = p.parseStmt() - } else { - p.expectSemi() - } - - return &ast.IfStmt{pos, s, x, body, else_} -} - -func (p *parser) parseTypeList() (list []ast.Expr) { - if p.trace { - defer un(trace(p, "TypeList")) - } - - list = append(list, p.parseType()) - for p.tok == token.COMMA { - p.next() - list = append(list, p.parseType()) - } - - return -} - -func (p *parser) parseCaseClause(exprSwitch bool) *ast.CaseClause { - if p.trace { - defer un(trace(p, "CaseClause")) - } - - pos := p.pos - var list []ast.Expr - if p.tok == token.CASE { - p.next() - if exprSwitch { - list = p.parseRhsList() - } else { - list = p.parseTypeList() - } - } else { - p.expect(token.DEFAULT) - } - - colon := p.expect(token.COLON) - p.openScope() - body := p.parseStmtList() - p.closeScope() - - return &ast.CaseClause{pos, list, colon, body} -} - -func isExprSwitch(s ast.Stmt) bool { - if s == nil { - return true - } - if e, ok := s.(*ast.ExprStmt); ok { - if a, ok := e.X.(*ast.TypeAssertExpr); ok { - return a.Type != nil // regular type assertion - } - return true - } - return false -} - -func (p *parser) parseSwitchStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "SwitchStmt")) - } - - pos := p.expect(token.SWITCH) - p.openScope() - defer p.closeScope() - - var s1, s2 ast.Stmt - if p.tok != token.LBRACE { - prevLev := p.exprLev - p.exprLev = -1 - if p.tok != token.SEMICOLON { - s2 = p.parseSimpleStmt(false) - } - if p.tok == token.SEMICOLON { - p.next() - s1 = s2 - s2 = nil - if p.tok != token.LBRACE { - s2 = p.parseSimpleStmt(false) - } - } - p.exprLev = prevLev - } - - exprSwitch := isExprSwitch(s2) - lbrace := p.expect(token.LBRACE) - var list []ast.Stmt - for p.tok == token.CASE || p.tok == token.DEFAULT { - list = append(list, p.parseCaseClause(exprSwitch)) - } - rbrace := p.expect(token.RBRACE) - p.expectSemi() - body := &ast.BlockStmt{lbrace, list, rbrace} - - if exprSwitch { - return &ast.SwitchStmt{pos, s1, p.makeExpr(s2), body} - } - // type switch - // TODO(gri): do all the checks! - return &ast.TypeSwitchStmt{pos, s1, s2, body} -} - -func (p *parser) parseCommClause() *ast.CommClause { - if p.trace { - defer un(trace(p, "CommClause")) - } - - p.openScope() - pos := p.pos - var comm ast.Stmt - if p.tok == token.CASE { - p.next() - lhs := p.parseLhsList() - if p.tok == token.ARROW { - // SendStmt - if len(lhs) > 1 { - p.errorExpected(lhs[0].Pos(), "1 expression") - // continue with first expression - } - arrow := p.pos - p.next() - rhs := p.parseRhs() - comm = &ast.SendStmt{lhs[0], arrow, rhs} - } else { - // RecvStmt - pos := p.pos - tok := p.tok - var rhs ast.Expr - if tok == token.ASSIGN || tok == token.DEFINE { - // RecvStmt with assignment - if len(lhs) > 2 { - p.errorExpected(lhs[0].Pos(), "1 or 2 expressions") - // continue with first two expressions - lhs = lhs[0:2] - } - p.next() - rhs = p.parseRhs() - } else { - // rhs must be single receive operation - if len(lhs) > 1 { - p.errorExpected(lhs[0].Pos(), "1 expression") - // continue with first expression - } - rhs = lhs[0] - lhs = nil // there is no lhs - } - if x, isUnary := rhs.(*ast.UnaryExpr); !isUnary || x.Op != token.ARROW { - p.errorExpected(rhs.Pos(), "send or receive operation") - rhs = &ast.BadExpr{rhs.Pos(), rhs.End()} - } - if lhs != nil { - comm = &ast.AssignStmt{lhs, pos, tok, []ast.Expr{rhs}} - } else { - comm = &ast.ExprStmt{rhs} - } - } - } else { - p.expect(token.DEFAULT) - } - - colon := p.expect(token.COLON) - body := p.parseStmtList() - p.closeScope() - - return &ast.CommClause{pos, comm, colon, body} -} - -func (p *parser) parseSelectStmt() *ast.SelectStmt { - if p.trace { - defer un(trace(p, "SelectStmt")) - } - - pos := p.expect(token.SELECT) - lbrace := p.expect(token.LBRACE) - var list []ast.Stmt - for p.tok == token.CASE || p.tok == token.DEFAULT { - list = append(list, p.parseCommClause()) - } - rbrace := p.expect(token.RBRACE) - p.expectSemi() - body := &ast.BlockStmt{lbrace, list, rbrace} - - return &ast.SelectStmt{pos, body} -} - -func (p *parser) parseForStmt() ast.Stmt { - if p.trace { - defer un(trace(p, "ForStmt")) - } - - pos := p.expect(token.FOR) - p.openScope() - defer p.closeScope() - - var s1, s2, s3 ast.Stmt - if p.tok != token.LBRACE { - prevLev := p.exprLev - p.exprLev = -1 - if p.tok != token.SEMICOLON { - s2 = p.parseSimpleStmt(false) - } - if p.tok == token.SEMICOLON { - p.next() - s1 = s2 - s2 = nil - if p.tok != token.SEMICOLON { - s2 = p.parseSimpleStmt(false) - } - p.expectSemi() - if p.tok != token.LBRACE { - s3 = p.parseSimpleStmt(false) - } - } - p.exprLev = prevLev - } - - body := p.parseBlockStmt() - p.expectSemi() - - if as, isAssign := s2.(*ast.AssignStmt); isAssign { - // possibly a for statement with a range clause; check assignment operator - if as.Tok != token.ASSIGN && as.Tok != token.DEFINE { - p.errorExpected(as.TokPos, "'=' or ':='") - return &ast.BadStmt{pos, body.End()} - } - // check lhs - var key, value ast.Expr - switch len(as.Lhs) { - case 2: - key, value = as.Lhs[0], as.Lhs[1] - case 1: - key = as.Lhs[0] - default: - p.errorExpected(as.Lhs[0].Pos(), "1 or 2 expressions") - return &ast.BadStmt{pos, body.End()} - } - // check rhs - if len(as.Rhs) != 1 { - p.errorExpected(as.Rhs[0].Pos(), "1 expression") - return &ast.BadStmt{pos, body.End()} - } - if rhs, isUnary := as.Rhs[0].(*ast.UnaryExpr); isUnary && rhs.Op == token.RANGE { - // rhs is range expression - // (any short variable declaration was handled by parseSimpleStat above) - return &ast.RangeStmt{pos, key, value, as.TokPos, as.Tok, rhs.X, body} - } - p.errorExpected(s2.Pos(), "range clause") - return &ast.BadStmt{pos, body.End()} - } - - // regular for statement - return &ast.ForStmt{pos, s1, p.makeExpr(s2), s3, body} -} - -func (p *parser) parseStmt() (s ast.Stmt) { - if p.trace { - defer un(trace(p, "Statement")) - } - - switch p.tok { - case token.CONST, token.TYPE, token.VAR: - s = &ast.DeclStmt{p.parseDecl()} - case - // tokens that may start a top-level expression - token.IDENT, token.INT, token.FLOAT, token.CHAR, token.STRING, token.FUNC, token.LPAREN, // operand - token.LBRACK, token.STRUCT, // composite type - token.MUL, token.AND, token.ARROW, token.ADD, token.SUB, token.XOR: // unary operators - s = p.parseSimpleStmt(true) - // because of the required look-ahead, labeled statements are - // parsed by parseSimpleStmt - don't expect a semicolon after - // them - if _, isLabeledStmt := s.(*ast.LabeledStmt); !isLabeledStmt { - p.expectSemi() - } - case token.GO: - s = p.parseGoStmt() - case token.DEFER: - s = p.parseDeferStmt() - case token.RETURN: - s = p.parseReturnStmt() - case token.BREAK, token.CONTINUE, token.GOTO, token.FALLTHROUGH: - s = p.parseBranchStmt(p.tok) - case token.LBRACE: - s = p.parseBlockStmt() - p.expectSemi() - case token.IF: - s = p.parseIfStmt() - case token.SWITCH: - s = p.parseSwitchStmt() - case token.SELECT: - s = p.parseSelectStmt() - case token.FOR: - s = p.parseForStmt() - case token.SEMICOLON: - s = &ast.EmptyStmt{p.pos} - p.next() - case token.RBRACE: - // a semicolon may be omitted before a closing "}" - s = &ast.EmptyStmt{p.pos} - default: - // no statement found - pos := p.pos - p.errorExpected(pos, "statement") - p.next() // make progress - s = &ast.BadStmt{pos, p.pos} - } - - return -} - -// ---------------------------------------------------------------------------- -// Declarations - -type parseSpecFunction func(p *parser, doc *ast.CommentGroup, iota int) ast.Spec - -func parseImportSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec { - if p.trace { - defer un(trace(p, "ImportSpec")) - } - - var ident *ast.Ident - switch p.tok { - case token.PERIOD: - ident = &ast.Ident{p.pos, ".", nil} - p.next() - case token.IDENT: - ident = p.parseIdent() - } - - var path *ast.BasicLit - if p.tok == token.STRING { - path = &ast.BasicLit{p.pos, p.tok, p.lit} - p.next() - } else { - p.expect(token.STRING) // use expect() error handling - } - p.expectSemi() // call before accessing p.linecomment - - // collect imports - spec := &ast.ImportSpec{doc, ident, path, p.lineComment} - p.imports = append(p.imports, spec) - - return spec -} - -func parseConstSpec(p *parser, doc *ast.CommentGroup, iota int) ast.Spec { - if p.trace { - defer un(trace(p, "ConstSpec")) - } - - idents := p.parseIdentList() - typ := p.tryType() - var values []ast.Expr - if typ != nil || p.tok == token.ASSIGN || iota == 0 { - p.expect(token.ASSIGN) - values = p.parseRhsList() - } - p.expectSemi() // call before accessing p.linecomment - - // Go spec: The scope of a constant or variable identifier declared inside - // a function begins at the end of the ConstSpec or VarSpec and ends at - // the end of the innermost containing block. - // (Global identifiers are resolved in a separate phase after parsing.) - spec := &ast.ValueSpec{doc, idents, typ, values, p.lineComment} - p.declare(spec, p.topScope, ast.Con, idents...) - - return spec -} - -func parseTypeSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec { - if p.trace { - defer un(trace(p, "TypeSpec")) - } - - ident := p.parseIdent() - - // Go spec: The scope of a type identifier declared inside a function begins - // at the identifier in the TypeSpec and ends at the end of the innermost - // containing block. - // (Global identifiers are resolved in a separate phase after parsing.) - spec := &ast.TypeSpec{doc, ident, nil, nil} - p.declare(spec, p.topScope, ast.Typ, ident) - - spec.Type = p.parseType() - p.expectSemi() // call before accessing p.linecomment - spec.Comment = p.lineComment - - return spec -} - -func parseVarSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec { - if p.trace { - defer un(trace(p, "VarSpec")) - } - - idents := p.parseIdentList() - typ := p.tryType() - var values []ast.Expr - if typ == nil || p.tok == token.ASSIGN { - p.expect(token.ASSIGN) - values = p.parseRhsList() - } - p.expectSemi() // call before accessing p.linecomment - - // Go spec: The scope of a constant or variable identifier declared inside - // a function begins at the end of the ConstSpec or VarSpec and ends at - // the end of the innermost containing block. - // (Global identifiers are resolved in a separate phase after parsing.) - spec := &ast.ValueSpec{doc, idents, typ, values, p.lineComment} - p.declare(spec, p.topScope, ast.Var, idents...) - - return spec -} - -func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.GenDecl { - if p.trace { - defer un(trace(p, "GenDecl("+keyword.String()+")")) - } - - doc := p.leadComment - pos := p.expect(keyword) - var lparen, rparen token.Pos - var list []ast.Spec - if p.tok == token.LPAREN { - lparen = p.pos - p.next() - for iota := 0; p.tok != token.RPAREN && p.tok != token.EOF; iota++ { - list = append(list, f(p, p.leadComment, iota)) - } - rparen = p.expect(token.RPAREN) - p.expectSemi() - } else { - list = append(list, f(p, nil, 0)) - } - - return &ast.GenDecl{doc, pos, keyword, lparen, list, rparen} -} - -func (p *parser) parseReceiver(scope *ast.Scope) *ast.FieldList { - if p.trace { - defer un(trace(p, "Receiver")) - } - - pos := p.pos - par := p.parseParameters(scope, false) - - // must have exactly one receiver - if par.NumFields() != 1 { - p.errorExpected(pos, "exactly one receiver") - // TODO determine a better range for BadExpr below - par.List = []*ast.Field{{Type: &ast.BadExpr{pos, pos}}} - return par - } - - // recv type must be of the form ["*"] identifier - recv := par.List[0] - base := deref(recv.Type) - if _, isIdent := base.(*ast.Ident); !isIdent { - p.errorExpected(base.Pos(), "(unqualified) identifier") - par.List = []*ast.Field{{Type: &ast.BadExpr{recv.Pos(), recv.End()}}} - } - - return par -} - -func (p *parser) parseFuncDecl() *ast.FuncDecl { - if p.trace { - defer un(trace(p, "FunctionDecl")) - } - - doc := p.leadComment - pos := p.expect(token.FUNC) - scope := ast.NewScope(p.topScope) // function scope - - var recv *ast.FieldList - if p.tok == token.LPAREN { - recv = p.parseReceiver(scope) - } - - ident := p.parseIdent() - - params, results := p.parseSignature(scope) - - var body *ast.BlockStmt - if p.tok == token.LBRACE { - body = p.parseBody(scope) - } - p.expectSemi() - - decl := &ast.FuncDecl{doc, recv, ident, &ast.FuncType{pos, params, results}, body} - if recv == nil { - // Go spec: The scope of an identifier denoting a constant, type, - // variable, or function (but not method) declared at top level - // (outside any function) is the package block. - // - // init() functions cannot be referred to and there may - // be more than one - don't put them in the pkgScope - if ident.Name != "init" { - p.declare(decl, p.pkgScope, ast.Fun, ident) - } - } - - return decl -} - -func (p *parser) parseDecl() ast.Decl { - if p.trace { - defer un(trace(p, "Declaration")) - } - - var f parseSpecFunction - switch p.tok { - case token.CONST: - f = parseConstSpec - - case token.TYPE: - f = parseTypeSpec - - case token.VAR: - f = parseVarSpec - - case token.FUNC: - return p.parseFuncDecl() - - default: - pos := p.pos - p.errorExpected(pos, "declaration") - p.next() // make progress - decl := &ast.BadDecl{pos, p.pos} - return decl - } - - return p.parseGenDecl(p.tok, f) -} - -func (p *parser) parseDeclList() (list []ast.Decl) { - if p.trace { - defer un(trace(p, "DeclList")) - } - - for p.tok != token.EOF { - list = append(list, p.parseDecl()) - } - - return -} - -// ---------------------------------------------------------------------------- -// Source files - -func (p *parser) parseFile() *ast.File { - if p.trace { - defer un(trace(p, "File")) - } - - // package clause - doc := p.leadComment - pos := p.expect(token.PACKAGE) - // Go spec: The package clause is not a declaration; - // the package name does not appear in any scope. - ident := p.parseIdent() - if ident.Name == "_" { - p.error(p.pos, "invalid package name _") - } - p.expectSemi() - - var decls []ast.Decl - - // Don't bother parsing the rest if we had errors already. - // Likely not a Go source file at all. - - if p.ErrorCount() == 0 && p.mode&PackageClauseOnly == 0 { - // import decls - for p.tok == token.IMPORT { - decls = append(decls, p.parseGenDecl(token.IMPORT, parseImportSpec)) - } - - if p.mode&ImportsOnly == 0 { - // rest of package body - for p.tok != token.EOF { - decls = append(decls, p.parseDecl()) - } - } - } - - assert(p.topScope == p.pkgScope, "imbalanced scopes") - - // resolve global identifiers within the same file - i := 0 - for _, ident := range p.unresolved { - // i <= index for current ident - assert(ident.Obj == unresolved, "object already resolved") - ident.Obj = p.pkgScope.Lookup(ident.Name) // also removes unresolved sentinel - if ident.Obj == nil { - p.unresolved[i] = ident - i++ - } - } - - // TODO(gri): store p.imports in AST - return &ast.File{doc, pos, ident, decls, p.pkgScope, p.imports, p.unresolved[0:i], p.comments} -} diff --git a/internal/backport/go/printer/testdata/slow.golden b/internal/backport/go/printer/testdata/slow.golden deleted file mode 100644 index 43a15cb1d0..0000000000 --- a/internal/backport/go/printer/testdata/slow.golden +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package deepequal_test - -import ( - "testing" - "google3/spam/archer/frontend/deepequal" -) - -func TestTwoNilValues(t *testing.T) { - if err := deepequal.Check(nil, nil); err != nil { - t.Errorf("expected nil, saw %v", err) - } -} - -type Foo struct { - bar *Bar - bang *Bar -} - -type Bar struct { - baz *Baz - foo []*Foo -} - -type Baz struct { - entries map[int]interface{} - whatever string -} - -func newFoo() *Foo { - return &Foo{bar: &Bar{baz: &Baz{ - entries: map[int]interface{}{ - 42: &Foo{}, - 21: &Bar{}, - 11: &Baz{whatever: "it's just a test"}}}}, - bang: &Bar{foo: []*Foo{ - &Foo{bar: &Bar{baz: &Baz{ - entries: map[int]interface{}{ - 43: &Foo{}, - 22: &Bar{}, - 13: &Baz{whatever: "this is nuts"}}}}, - bang: &Bar{foo: []*Foo{ - &Foo{bar: &Bar{baz: &Baz{ - entries: map[int]interface{}{ - 61: &Foo{}, - 71: &Bar{}, - 11: &Baz{whatever: "no, it's Go"}}}}, - bang: &Bar{foo: []*Foo{ - &Foo{bar: &Bar{baz: &Baz{ - entries: map[int]interface{}{ - 0: &Foo{}, - -2: &Bar{}, - -11: &Baz{whatever: "we need to go deeper"}}}}, - bang: &Bar{foo: []*Foo{ - &Foo{bar: &Bar{baz: &Baz{ - entries: map[int]interface{}{ - -2: &Foo{}, - -5: &Bar{}, - -7: &Baz{whatever: "are you serious?"}}}}, - bang: &Bar{foo: []*Foo{}}}, - &Foo{bar: &Bar{baz: &Baz{ - entries: map[int]interface{}{ - -100: &Foo{}, - 50: &Bar{}, - 20: &Baz{whatever: "na, not really ..."}}}}, - bang: &Bar{foo: []*Foo{}}}}}}}}}, - &Foo{bar: &Bar{baz: &Baz{ - entries: map[int]interface{}{ - 2: &Foo{}, - 1: &Bar{}, - -1: &Baz{whatever: "... it's just a test."}}}}, - bang: &Bar{foo: []*Foo{}}}}}}}}} -} - -func TestElaborate(t *testing.T) { - a := newFoo() - b := newFoo() - - if err := deepequal.Check(a, b); err != nil { - t.Errorf("expected nil, saw %v", err) - } -} diff --git a/internal/backport/go/printer/testdata/slow.input b/internal/backport/go/printer/testdata/slow.input deleted file mode 100644 index 0e5a23d886..0000000000 --- a/internal/backport/go/printer/testdata/slow.input +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package deepequal_test - -import ( - "testing" - "google3/spam/archer/frontend/deepequal" -) - -func TestTwoNilValues(t *testing.T) { - if err := deepequal.Check(nil, nil); err != nil { - t.Errorf("expected nil, saw %v", err) - } -} - -type Foo struct { - bar *Bar - bang *Bar -} - -type Bar struct { - baz *Baz - foo []*Foo -} - -type Baz struct { - entries map[int]interface{} - whatever string -} - -func newFoo() (*Foo) { -return &Foo{bar: &Bar{ baz: &Baz{ -entries: map[int]interface{}{ -42: &Foo{}, -21: &Bar{}, -11: &Baz{ whatever: "it's just a test" }}}}, - bang: &Bar{foo: []*Foo{ -&Foo{bar: &Bar{ baz: &Baz{ -entries: map[int]interface{}{ -43: &Foo{}, -22: &Bar{}, -13: &Baz{ whatever: "this is nuts" }}}}, - bang: &Bar{foo: []*Foo{ -&Foo{bar: &Bar{ baz: &Baz{ -entries: map[int]interface{}{ -61: &Foo{}, -71: &Bar{}, -11: &Baz{ whatever: "no, it's Go" }}}}, - bang: &Bar{foo: []*Foo{ -&Foo{bar: &Bar{ baz: &Baz{ -entries: map[int]interface{}{ -0: &Foo{}, --2: &Bar{}, --11: &Baz{ whatever: "we need to go deeper" }}}}, - bang: &Bar{foo: []*Foo{ -&Foo{bar: &Bar{ baz: &Baz{ -entries: map[int]interface{}{ --2: &Foo{}, --5: &Bar{}, --7: &Baz{ whatever: "are you serious?" }}}}, - bang: &Bar{foo: []*Foo{}}}, -&Foo{bar: &Bar{ baz: &Baz{ -entries: map[int]interface{}{ --100: &Foo{}, -50: &Bar{}, -20: &Baz{ whatever: "na, not really ..." }}}}, - bang: &Bar{foo: []*Foo{}}}}}}}}}, -&Foo{bar: &Bar{ baz: &Baz{ -entries: map[int]interface{}{ -2: &Foo{}, -1: &Bar{}, --1: &Baz{ whatever: "... it's just a test." }}}}, - bang: &Bar{foo: []*Foo{}}}}}}}}} -} - -func TestElaborate(t *testing.T) { - a := newFoo() - b := newFoo() - - if err := deepequal.Check(a, b); err != nil { - t.Errorf("expected nil, saw %v", err) - } -} diff --git a/internal/backport/go/printer/testdata/statements.golden b/internal/backport/go/printer/testdata/statements.golden deleted file mode 100644 index 4b13460473..0000000000 --- a/internal/backport/go/printer/testdata/statements.golden +++ /dev/null @@ -1,644 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package statements - -var expr bool - -func use(x interface{}) {} - -// Formatting of multi-line return statements. -func _f() { - return - return x, y, z - return T{} - return T{1, 2, 3}, - x, y, z - return T{1, 2, 3}, - x, y, - z - return T{1, - 2, - 3} - return T{1, - 2, - 3, - } - return T{ - 1, - 2, - 3} - return T{ - 1, - 2, - 3, - } - return T{ - 1, - T{1, 2, 3}, - 3, - } - return T{ - 1, - T{1, - 2, 3}, - 3, - } - return T{ - 1, - T{1, - 2, - 3}, - 3, - } - return T{ - 1, - 2, - }, nil - return T{ - 1, - 2, - }, - T{ - x: 3, - y: 4, - }, nil - return T{ - 1, - 2, - }, - nil - return T{ - 1, - 2, - }, - T{ - x: 3, - y: 4, - }, - nil - return x + y + - z - return func() {} - return func() { - _ = 0 - }, T{ - 1, 2, - } - return func() { - _ = 0 - } - return func() T { - return T{ - 1, 2, - } - } -} - -// Formatting of multi-line returns: test cases from issue 1207. -func F() (*T, os.Error) { - return &T{ - X: 1, - Y: 2, - }, - nil -} - -func G() (*T, *T, os.Error) { - return &T{ - X: 1, - Y: 2, - }, - &T{ - X: 3, - Y: 4, - }, - nil -} - -func _() interface{} { - return &fileStat{ - name: basename(file.name), - size: mkSize(d.FileSizeHigh, d.FileSizeLow), - modTime: mkModTime(d.LastWriteTime), - mode: mkMode(d.FileAttributes), - sys: mkSysFromFI(&d), - }, nil -} - -// Formatting of if-statement headers. -func _() { - if true { - } - if true { - } // no semicolon printed - if expr { - } - if expr { - } // no semicolon printed - if expr { - } // no parens printed - if expr { - } // no semicolon and parens printed - if x := expr; true { - use(x) - } - if x := expr; expr { - use(x) - } -} - -// Formatting of switch-statement headers. -func _() { - switch { - } - switch { - } // no semicolon printed - switch expr { - } - switch expr { - } // no semicolon printed - switch expr { - } // no parens printed - switch expr { - } // no semicolon and parens printed - switch x := expr; { - default: - use( - x) - } - switch x := expr; expr { - default: - use(x) - } -} - -// Formatting of switch statement bodies. -func _() { - switch { - } - - switch x := 0; x { - case 1: - use(x) - use(x) // followed by an empty line - - case 2: // followed by an empty line - - use(x) // followed by an empty line - - case 3: // no empty lines - use(x) - use(x) - } - - switch x { - case 0: - use(x) - case 1: // this comment should have no effect on the previous or next line - use(x) - } - - switch x := 0; x { - case 1: - x = 0 - // this comment should be indented - case 2: - x = 0 - // this comment should not be indented, it is aligned with the next case - case 3: - x = 0 - /* indented comment - aligned - aligned - */ - // bla - /* and more */ - case 4: - x = 0 - /* not indented comment - aligned - aligned - */ - // bla - /* and more */ - case 5: - } -} - -// Formatting of selected select statements. -func _() { - select {} - select { /* this comment should not be tab-aligned because the closing } is on the same line */ - } - select { /* this comment should be tab-aligned */ - } - select { // this comment should be tab-aligned - } - select { - case <-c: - } -} - -// Formatting of for-statement headers for single-line for-loops. -func _() { - for { - } - for expr { - } - for expr { - } // no parens printed - for { - } // no semicolons printed - for x := expr; ; { - use(x) - } - for expr { - } // no semicolons printed - for expr { - } // no semicolons and parens printed - for ; ; expr = false { - } - for x := expr; expr; { - use(x) - } - for x := expr; ; expr = false { - use(x) - } - for ; expr; expr = false { - } - for x := expr; expr; expr = false { - use(x) - } - for x := range []int{} { - use(x) - } - for x := range []int{} { - use(x) - } // no parens printed -} - -// Formatting of for-statement headers for multi-line for-loops. -func _() { - for { - } - for expr { - } - for expr { - } // no parens printed - for { - } // no semicolons printed - for x := expr; ; { - use(x) - } - for expr { - } // no semicolons printed - for expr { - } // no semicolons and parens printed - for ; ; expr = false { - } - for x := expr; expr; { - use(x) - } - for x := expr; ; expr = false { - use(x) - } - for ; expr; expr = false { - } - for x := expr; expr; expr = false { - use(x) - } - for range []int{} { - println("foo") - } - for x := range []int{} { - use(x) - } - for x := range []int{} { - use(x) - } // no parens printed -} - -// Formatting of selected short single- and multi-line statements. -func _() { - if cond { - } - if cond { - } // multiple lines - if cond { - } else { - } // else clause always requires multiple lines - - for { - } - for i := 0; i < len(a); 1++ { - } - for i := 0; i < len(a); 1++ { - a[i] = i - } - for i := 0; i < len(a); 1++ { - a[i] = i - } // multiple lines - - for range a { - } - for _ = range a { - } - for _, _ = range a { - } - for i := range a { - } - for i := range a { - a[i] = i - } - for i := range a { - a[i] = i - } // multiple lines - - go func() { - for { - a <- <-b - } - }() - defer func() { - if x := recover(); x != nil { - err = fmt.Sprintf("error: %s", x.msg) - } - }() -} - -// Don't remove mandatory parentheses around composite literals in control clauses. -func _() { - // strip parentheses - no composite literals or composite literals don't start with a type name - if x { - } - if x { - } - if []T{} { - } - if []T{} { - } - if []T{} { - } - - for x { - } - for x { - } - for []T{} { - } - for []T{} { - } - for []T{} { - } - - switch x { - } - switch x { - } - switch []T{} { - } - switch []T{} { - } - - for _ = range []T{T{42}} { - } - - // leave parentheses - composite literals start with a type name - if (T{}) { - } - if (T{}) { - } - if (T{}) { - } - - for (T{}) { - } - for (T{}) { - } - for (T{}) { - } - - switch (T{}) { - } - switch (T{}) { - } - - for _ = range (T1{T{42}}) { - } - - if x == (T{42}[0]) { - } - if (x == T{42}[0]) { - } - if x == (T{42}[0]) { - } - if x == (T{42}[0]) { - } - if x == (T{42}[0]) { - } - if x == a+b*(T{42}[0]) { - } - if (x == a+b*T{42}[0]) { - } - if x == a+b*(T{42}[0]) { - } - if x == a+(b*(T{42}[0])) { - } - if x == a+b*(T{42}[0]) { - } - if (a + b*(T{42}[0])) == x { - } - if (a + b*(T{42}[0])) == x { - } - - if struct{ x bool }{false}.x { - } - if (struct{ x bool }{false}.x) == false { - } - if struct{ x bool }{false}.x == false { - } -} - -// Extra empty lines inside functions. Do respect source code line -// breaks between statement boundaries but print at most one empty -// line at a time. -func _() { - - const _ = 0 - - const _ = 1 - type _ int - type _ float - - var _ = 0 - var x = 1 - - // Each use(x) call below should have at most one empty line before and after. - // Known bug: The first use call may have more than one empty line before - // (see go/printer/nodes.go, func linebreak). - - use(x) - - if x < x { - - use(x) - - } else { - - use(x) - - } -} - -// Formatting around labels. -func _() { -L: -} - -func _() { - // this comment should be indented -L: // no semicolon needed -} - -func _() { - switch 0 { - case 0: - L0: - ; // semicolon required - case 1: - L1: - ; // semicolon required - default: - L2: // no semicolon needed - } -} - -func _() { - f() -L1: - f() -L2: - ; -L3: -} - -func _() { - // this comment should be indented -L: -} - -func _() { -L: - _ = 0 -} - -func _() { - // this comment should be indented -L: - _ = 0 -} - -func _() { - for { - L1: - _ = 0 - L2: - _ = 0 - } -} - -func _() { - // this comment should be indented - for { - L1: - _ = 0 - L2: - _ = 0 - } -} - -func _() { - if true { - _ = 0 - } - _ = 0 // the indentation here should not be affected by the long label name -AnOverlongLabel: - _ = 0 - - if true { - _ = 0 - } - _ = 0 - -L: - _ = 0 -} - -func _() { - for { - goto L - } -L: - - MoreCode() -} - -func _() { - for { - goto L - } -L: // A comment on the same line as the label, followed by a single empty line. - // Known bug: There may be more than one empty line before MoreCode() - // (see go/printer/nodes.go, func linebreak). - - MoreCode() -} - -func _() { - for { - goto L - } -L: - - // There should be a single empty line before this comment. - MoreCode() -} - -func _() { - for { - goto AVeryLongLabelThatShouldNotAffectFormatting - } -AVeryLongLabelThatShouldNotAffectFormatting: - // There should be a single empty line after this comment. - - // There should be a single empty line before this comment. - MoreCode() -} - -// Formatting of empty statements. -func _() { - -} - -func _() { -} - -func _() { -} - -func _() { - f() -} - -func _() { -L: - ; -} - -func _() { -L: - ; - f() -} diff --git a/internal/backport/go/printer/testdata/statements.input b/internal/backport/go/printer/testdata/statements.input deleted file mode 100644 index cade1576bf..0000000000 --- a/internal/backport/go/printer/testdata/statements.input +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package statements - -var expr bool - -func use(x interface{}) {} - -// Formatting of multi-line return statements. -func _f() { - return - return x, y, z - return T{} - return T{1, 2, 3}, - x, y, z - return T{1, 2, 3}, - x, y, - z - return T{1, - 2, - 3} - return T{1, - 2, - 3, - } - return T{ - 1, - 2, - 3} - return T{ - 1, - 2, - 3, - } - return T{ - 1, - T{1, 2, 3}, - 3, - } - return T{ - 1, - T{1, - 2, 3}, - 3, - } - return T{ - 1, - T{1, - 2, - 3}, - 3, - } - return T{ - 1, - 2, - }, nil - return T{ - 1, - 2, - }, - T{ - x: 3, - y: 4, - }, nil - return T{ - 1, - 2, - }, - nil - return T{ - 1, - 2, - }, - T{ - x: 3, - y: 4, - }, - nil - return x + y + - z - return func() {} - return func() { - _ = 0 - }, T{ - 1, 2, - } - return func() { - _ = 0 - } - return func() T { - return T { - 1, 2, - } - } -} - -// Formatting of multi-line returns: test cases from issue 1207. -func F() (*T, os.Error) { - return &T{ - X: 1, - Y: 2, - }, - nil -} - -func G() (*T, *T, os.Error) { - return &T{ - X: 1, - Y: 2, - }, - &T{ - X: 3, - Y: 4, - }, - nil -} - -func _() interface{} { - return &fileStat{ - name: basename(file.name), - size: mkSize(d.FileSizeHigh, d.FileSizeLow), - modTime: mkModTime(d.LastWriteTime), - mode: mkMode(d.FileAttributes), - sys: mkSysFromFI(&d), - }, nil -} - -// Formatting of if-statement headers. -func _() { - if true {} - if; true {} // no semicolon printed - if expr{} - if;expr{} // no semicolon printed - if (expr){} // no parens printed - if;((expr)){} // no semicolon and parens printed - if x:=expr;true{ - use(x)} - if x:=expr; expr {use(x)} -} - - -// Formatting of switch-statement headers. -func _() { - switch {} - switch;{} // no semicolon printed - switch expr {} - switch;expr{} // no semicolon printed - switch (expr) {} // no parens printed - switch;((expr)){} // no semicolon and parens printed - switch x := expr; { default:use( -x) - } - switch x := expr; expr {default:use(x)} -} - - -// Formatting of switch statement bodies. -func _() { - switch { - } - - switch x := 0; x { - case 1: - use(x) - use(x) // followed by an empty line - - case 2: // followed by an empty line - - use(x) // followed by an empty line - - case 3: // no empty lines - use(x) - use(x) - } - - switch x { - case 0: - use(x) - case 1: // this comment should have no effect on the previous or next line - use(x) - } - - switch x := 0; x { - case 1: - x = 0 - // this comment should be indented - case 2: - x = 0 - // this comment should not be indented, it is aligned with the next case - case 3: - x = 0 - /* indented comment - aligned - aligned - */ - // bla - /* and more */ - case 4: - x = 0 - /* not indented comment - aligned - aligned - */ - // bla - /* and more */ - case 5: - } -} - - -// Formatting of selected select statements. -func _() { - select { - } - select { /* this comment should not be tab-aligned because the closing } is on the same line */ } - select { /* this comment should be tab-aligned */ - } - select { // this comment should be tab-aligned - } - select { case <-c: } -} - - -// Formatting of for-statement headers for single-line for-loops. -func _() { - for{} - for expr {} - for (expr) {} // no parens printed - for;;{} // no semicolons printed - for x :=expr;; {use( x)} - for; expr;{} // no semicolons printed - for; ((expr));{} // no semicolons and parens printed - for; ; expr = false {} - for x :=expr; expr; {use(x)} - for x := expr;; expr=false {use(x)} - for;expr;expr =false {} - for x := expr;expr;expr = false { use(x) } - for x := range []int{} { use(x) } - for x := range (([]int{})) { use(x) } // no parens printed -} - - -// Formatting of for-statement headers for multi-line for-loops. -func _() { - for{ - } - for expr { - } - for (expr) { - } // no parens printed - for;;{ - } // no semicolons printed - for x :=expr;; {use( x) - } - for; expr;{ - } // no semicolons printed - for; ((expr));{ - } // no semicolons and parens printed - for; ; expr = false { - } - for x :=expr; expr; {use(x) - } - for x := expr;; expr=false {use(x) - } - for;expr;expr =false { - } - for x := expr;expr;expr = false { - use(x) - } - for range []int{} { - println("foo")} - for x := range []int{} { - use(x) } - for x := range (([]int{})) { - use(x) } // no parens printed -} - - -// Formatting of selected short single- and multi-line statements. -func _() { - if cond {} - if cond { - } // multiple lines - if cond {} else {} // else clause always requires multiple lines - - for {} - for i := 0; i < len(a); 1++ {} - for i := 0; i < len(a); 1++ { a[i] = i } - for i := 0; i < len(a); 1++ { a[i] = i - } // multiple lines - - for range a{} - for _ = range a{} - for _, _ = range a{} - for i := range a {} - for i := range a { a[i] = i } - for i := range a { a[i] = i - } // multiple lines - - go func() { for { a <- <-b } }() - defer func() { if x := recover(); x != nil { err = fmt.Sprintf("error: %s", x.msg) } }() -} - - -// Don't remove mandatory parentheses around composite literals in control clauses. -func _() { - // strip parentheses - no composite literals or composite literals don't start with a type name - if (x) {} - if (((x))) {} - if ([]T{}) {} - if (([]T{})) {} - if ; (((([]T{})))) {} - - for (x) {} - for (((x))) {} - for ([]T{}) {} - for (([]T{})) {} - for ; (((([]T{})))) ; {} - - switch (x) {} - switch (((x))) {} - switch ([]T{}) {} - switch ; (((([]T{})))) {} - - for _ = range ((([]T{T{42}}))) {} - - // leave parentheses - composite literals start with a type name - if (T{}) {} - if ((T{})) {} - if ; ((((T{})))) {} - - for (T{}) {} - for ((T{})) {} - for ; ((((T{})))) ; {} - - switch (T{}) {} - switch ; ((((T{})))) {} - - for _ = range (((T1{T{42}}))) {} - - if x == (T{42}[0]) {} - if (x == T{42}[0]) {} - if (x == (T{42}[0])) {} - if (x == (((T{42}[0])))) {} - if (((x == (T{42}[0])))) {} - if x == a + b*(T{42}[0]) {} - if (x == a + b*T{42}[0]) {} - if (x == a + b*(T{42}[0])) {} - if (x == a + ((b * (T{42}[0])))) {} - if (((x == a + b * (T{42}[0])))) {} - if (((a + b * (T{42}[0])) == x)) {} - if (((a + b * (T{42}[0])))) == x {} - - if (struct{x bool}{false}.x) {} - if (struct{x bool}{false}.x) == false {} - if (struct{x bool}{false}.x == false) {} -} - - -// Extra empty lines inside functions. Do respect source code line -// breaks between statement boundaries but print at most one empty -// line at a time. -func _() { - - const _ = 0 - - const _ = 1 - type _ int - type _ float - - var _ = 0 - var x = 1 - - // Each use(x) call below should have at most one empty line before and after. - // Known bug: The first use call may have more than one empty line before - // (see go/printer/nodes.go, func linebreak). - - - - use(x) - - if x < x { - - use(x) - - } else { - - use(x) - - } -} - - -// Formatting around labels. -func _() { - L: -} - - -func _() { - // this comment should be indented - L: ; // no semicolon needed -} - - -func _() { - switch 0 { - case 0: - L0: ; // semicolon required - case 1: - L1: ; // semicolon required - default: - L2: ; // no semicolon needed - } -} - - -func _() { - f() -L1: - f() -L2: - ; -L3: -} - - -func _() { - // this comment should be indented - L: -} - - -func _() { - L: _ = 0 -} - - -func _() { - // this comment should be indented - L: _ = 0 -} - - -func _() { - for { - L1: _ = 0 - L2: - _ = 0 - } -} - - -func _() { - // this comment should be indented - for { - L1: _ = 0 - L2: - _ = 0 - } -} - - -func _() { - if true { - _ = 0 - } - _ = 0 // the indentation here should not be affected by the long label name -AnOverlongLabel: - _ = 0 - - if true { - _ = 0 - } - _ = 0 - -L: _ = 0 -} - - -func _() { - for { - goto L - } -L: - - MoreCode() -} - - -func _() { - for { - goto L - } -L: // A comment on the same line as the label, followed by a single empty line. - // Known bug: There may be more than one empty line before MoreCode() - // (see go/printer/nodes.go, func linebreak). - - - - - MoreCode() -} - - -func _() { - for { - goto L - } -L: - - - - - // There should be a single empty line before this comment. - MoreCode() -} - - -func _() { - for { - goto AVeryLongLabelThatShouldNotAffectFormatting - } -AVeryLongLabelThatShouldNotAffectFormatting: - // There should be a single empty line after this comment. - - // There should be a single empty line before this comment. - MoreCode() -} - - -// Formatting of empty statements. -func _() { - ;;;;;;;;;;;;;;;;;;;;;;;;; -} - -func _() {;;;;;;;;;;;;;;;;;;;;;;;;; -} - -func _() {;;;;;;;;;;;;;;;;;;;;;;;;;} - -func _() { -f();;;;;;;;;;;;;;;;;;;;;;;;; -} - -func _() { -L:;;;;;;;;;;;; -} - -func _() { -L:;;;;;;;;;;;; - f() -} diff --git a/internal/backport/go/scanner/errors.go b/internal/backport/go/scanner/errors.go deleted file mode 100644 index 539bbfd636..0000000000 --- a/internal/backport/go/scanner/errors.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package scanner - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/token" - "io" - "sort" -) - -// In an ErrorList, an error is represented by an *Error. -// The position Pos, if valid, points to the beginning of -// the offending token, and the error condition is described -// by Msg. -type Error struct { - Pos token.Position - Msg string -} - -// Error implements the error interface. -func (e Error) Error() string { - if e.Pos.Filename != "" || e.Pos.IsValid() { - // don't print "" - // TODO(gri) reconsider the semantics of Position.IsValid - return e.Pos.String() + ": " + e.Msg - } - return e.Msg -} - -// ErrorList is a list of *Errors. -// The zero value for an ErrorList is an empty ErrorList ready to use. -type ErrorList []*Error - -// Add adds an Error with given position and error message to an ErrorList. -func (p *ErrorList) Add(pos token.Position, msg string) { - *p = append(*p, &Error{pos, msg}) -} - -// Reset resets an ErrorList to no errors. -func (p *ErrorList) Reset() { *p = (*p)[0:0] } - -// ErrorList implements the sort Interface. -func (p ErrorList) Len() int { return len(p) } -func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p ErrorList) Less(i, j int) bool { - e := &p[i].Pos - f := &p[j].Pos - // Note that it is not sufficient to simply compare file offsets because - // the offsets do not reflect modified line information (through //line - // comments). - if e.Filename != f.Filename { - return e.Filename < f.Filename - } - if e.Line != f.Line { - return e.Line < f.Line - } - if e.Column != f.Column { - return e.Column < f.Column - } - return p[i].Msg < p[j].Msg -} - -// Sort sorts an ErrorList. *Error entries are sorted by position, -// other errors are sorted by error message, and before any *Error -// entry. -func (p ErrorList) Sort() { - sort.Sort(p) -} - -// RemoveMultiples sorts an ErrorList and removes all but the first error per line. -func (p *ErrorList) RemoveMultiples() { - sort.Sort(p) - var last token.Position // initial last.Line is != any legal error line - i := 0 - for _, e := range *p { - if e.Pos.Filename != last.Filename || e.Pos.Line != last.Line { - last = e.Pos - (*p)[i] = e - i++ - } - } - *p = (*p)[0:i] -} - -// An ErrorList implements the error interface. -func (p ErrorList) Error() string { - switch len(p) { - case 0: - return "no errors" - case 1: - return p[0].Error() - } - return fmt.Sprintf("%s (and %d more errors)", p[0], len(p)-1) -} - -// Err returns an error equivalent to this error list. -// If the list is empty, Err returns nil. -func (p ErrorList) Err() error { - if len(p) == 0 { - return nil - } - return p -} - -// PrintError is a utility function that prints a list of errors to w, -// one error per line, if the err parameter is an ErrorList. Otherwise -// it prints the err string. -func PrintError(w io.Writer, err error) { - if list, ok := err.(ErrorList); ok { - for _, e := range list { - fmt.Fprintf(w, "%s\n", e) - } - } else if err != nil { - fmt.Fprintf(w, "%s\n", err) - } -} diff --git a/internal/backport/go/scanner/example_test.go b/internal/backport/go/scanner/example_test.go deleted file mode 100644 index e9092379a1..0000000000 --- a/internal/backport/go/scanner/example_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package scanner_test - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/scanner" - "golang.org/x/website/internal/backport/go/token" -) - -func ExampleScanner_Scan() { - // src is the input that we want to tokenize. - src := []byte("cos(x) + 1i*sin(x) // Euler") - - // Initialize the scanner. - var s scanner.Scanner - fset := token.NewFileSet() // positions are relative to fset - file := fset.AddFile("", fset.Base(), len(src)) // register input "file" - s.Init(file, src, nil /* no error handler */, scanner.ScanComments) - - // Repeated calls to Scan yield the token sequence found in the input. - for { - pos, tok, lit := s.Scan() - if tok == token.EOF { - break - } - fmt.Printf("%s\t%s\t%q\n", fset.Position(pos), tok, lit) - } - - // output: - // 1:1 IDENT "cos" - // 1:4 ( "" - // 1:5 IDENT "x" - // 1:6 ) "" - // 1:8 + "" - // 1:10 IMAG "1i" - // 1:12 * "" - // 1:13 IDENT "sin" - // 1:16 ( "" - // 1:17 IDENT "x" - // 1:18 ) "" - // 1:20 ; "\n" - // 1:20 COMMENT "// Euler" -} diff --git a/internal/backport/go/scanner/scanner.go b/internal/backport/go/scanner/scanner.go deleted file mode 100644 index f96569e417..0000000000 --- a/internal/backport/go/scanner/scanner.go +++ /dev/null @@ -1,983 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package scanner implements a scanner for Go source text. -// It takes a []byte as source which can then be tokenized -// through repeated calls to the Scan method. -package scanner - -import ( - "bytes" - "fmt" - "golang.org/x/website/internal/backport/go/token" - "path/filepath" - "strconv" - "unicode" - "unicode/utf8" -) - -// An ErrorHandler may be provided to Scanner.Init. If a syntax error is -// encountered and a handler was installed, the handler is called with a -// position and an error message. The position points to the beginning of -// the offending token. -type ErrorHandler func(pos token.Position, msg string) - -// A Scanner holds the scanner's internal state while processing -// a given text. It can be allocated as part of another data -// structure but must be initialized via Init before use. -type Scanner struct { - // immutable state - file *token.File // source file handle - dir string // directory portion of file.Name() - src []byte // source - err ErrorHandler // error reporting; or nil - mode Mode // scanning mode - - // scanning state - ch rune // current character - offset int // character offset - rdOffset int // reading offset (position after current character) - lineOffset int // current line offset - insertSemi bool // insert a semicolon before next newline - - // public state - ok to modify - ErrorCount int // number of errors encountered -} - -const ( - bom = 0xFEFF // byte order mark, only permitted as very first character - eof = -1 // end of file -) - -// Read the next Unicode char into s.ch. -// s.ch < 0 means end-of-file. -// -// For optimization, there is some overlap between this method and -// s.scanIdentifier. -func (s *Scanner) next() { - if s.rdOffset < len(s.src) { - s.offset = s.rdOffset - if s.ch == '\n' { - s.lineOffset = s.offset - s.file.AddLine(s.offset) - } - r, w := rune(s.src[s.rdOffset]), 1 - switch { - case r == 0: - s.error(s.offset, "illegal character NUL") - case r >= utf8.RuneSelf: - // not ASCII - r, w = utf8.DecodeRune(s.src[s.rdOffset:]) - if r == utf8.RuneError && w == 1 { - s.error(s.offset, "illegal UTF-8 encoding") - } else if r == bom && s.offset > 0 { - s.error(s.offset, "illegal byte order mark") - } - } - s.rdOffset += w - s.ch = r - } else { - s.offset = len(s.src) - if s.ch == '\n' { - s.lineOffset = s.offset - s.file.AddLine(s.offset) - } - s.ch = eof - } -} - -// peek returns the byte following the most recently read character without -// advancing the scanner. If the scanner is at EOF, peek returns 0. -func (s *Scanner) peek() byte { - if s.rdOffset < len(s.src) { - return s.src[s.rdOffset] - } - return 0 -} - -// A mode value is a set of flags (or 0). -// They control scanner behavior. -type Mode uint - -const ( - ScanComments Mode = 1 << iota // return comments as COMMENT tokens - dontInsertSemis // do not automatically insert semicolons - for testing only -) - -// Init prepares the scanner s to tokenize the text src by setting the -// scanner at the beginning of src. The scanner uses the file set file -// for position information and it adds line information for each line. -// It is ok to re-use the same file when re-scanning the same file as -// line information which is already present is ignored. Init causes a -// panic if the file size does not match the src size. -// -// Calls to Scan will invoke the error handler err if they encounter a -// syntax error and err is not nil. Also, for each error encountered, -// the Scanner field ErrorCount is incremented by one. The mode parameter -// determines how comments are handled. -// -// Note that Init may call err if there is an error in the first character -// of the file. -func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode) { - // Explicitly initialize all fields since a scanner may be reused. - if file.Size() != len(src) { - panic(fmt.Sprintf("file size (%d) does not match src len (%d)", file.Size(), len(src))) - } - s.file = file - s.dir, _ = filepath.Split(file.Name()) - s.src = src - s.err = err - s.mode = mode - - s.ch = ' ' - s.offset = 0 - s.rdOffset = 0 - s.lineOffset = 0 - s.insertSemi = false - s.ErrorCount = 0 - - s.next() - if s.ch == bom { - s.next() // ignore BOM at file beginning - } -} - -func (s *Scanner) error(offs int, msg string) { - if s.err != nil { - s.err(s.file.Position(s.file.Pos(offs)), msg) - } - s.ErrorCount++ -} - -func (s *Scanner) errorf(offs int, format string, args ...interface{}) { - s.error(offs, fmt.Sprintf(format, args...)) -} - -func (s *Scanner) scanComment() string { - // initial '/' already consumed; s.ch == '/' || s.ch == '*' - offs := s.offset - 1 // position of initial '/' - next := -1 // position immediately following the comment; < 0 means invalid comment - numCR := 0 - - if s.ch == '/' { - //-style comment - // (the final '\n' is not considered part of the comment) - s.next() - for s.ch != '\n' && s.ch >= 0 { - if s.ch == '\r' { - numCR++ - } - s.next() - } - // if we are at '\n', the position following the comment is afterwards - next = s.offset - if s.ch == '\n' { - next++ - } - goto exit - } - - /*-style comment */ - s.next() - for s.ch >= 0 { - ch := s.ch - if ch == '\r' { - numCR++ - } - s.next() - if ch == '*' && s.ch == '/' { - s.next() - next = s.offset - goto exit - } - } - - s.error(offs, "comment not terminated") - -exit: - lit := s.src[offs:s.offset] - - // On Windows, a (//-comment) line may end in "\r\n". - // Remove the final '\r' before analyzing the text for - // line directives (matching the compiler). Remove any - // other '\r' afterwards (matching the pre-existing be- - // havior of the scanner). - if numCR > 0 && len(lit) >= 2 && lit[1] == '/' && lit[len(lit)-1] == '\r' { - lit = lit[:len(lit)-1] - numCR-- - } - - // interpret line directives - // (//line directives must start at the beginning of the current line) - if next >= 0 /* implies valid comment */ && (lit[1] == '*' || offs == s.lineOffset) && bytes.HasPrefix(lit[2:], prefix) { - s.updateLineInfo(next, offs, lit) - } - - if numCR > 0 { - lit = stripCR(lit, lit[1] == '*') - } - - return string(lit) -} - -var prefix = []byte("line ") - -// updateLineInfo parses the incoming comment text at offset offs -// as a line directive. If successful, it updates the line info table -// for the position next per the line directive. -func (s *Scanner) updateLineInfo(next, offs int, text []byte) { - // extract comment text - if text[1] == '*' { - text = text[:len(text)-2] // lop off trailing "*/" - } - text = text[7:] // lop off leading "//line " or "/*line " - offs += 7 - - i, n, ok := trailingDigits(text) - if i == 0 { - return // ignore (not a line directive) - } - // i > 0 - - if !ok { - // text has a suffix :xxx but xxx is not a number - s.error(offs+i, "invalid line number: "+string(text[i:])) - return - } - - var line, col int - i2, n2, ok2 := trailingDigits(text[:i-1]) - if ok2 { - //line filename:line:col - i, i2 = i2, i - line, col = n2, n - if col == 0 { - s.error(offs+i2, "invalid column number: "+string(text[i2:])) - return - } - text = text[:i2-1] // lop off ":col" - } else { - //line filename:line - line = n - } - - if line == 0 { - s.error(offs+i, "invalid line number: "+string(text[i:])) - return - } - - // If we have a column (//line filename:line:col form), - // an empty filename means to use the previous filename. - filename := string(text[:i-1]) // lop off ":line", and trim white space - if filename == "" && ok2 { - filename = s.file.Position(s.file.Pos(offs)).Filename - } else if filename != "" { - // Put a relative filename in the current directory. - // This is for compatibility with earlier releases. - // See issue 26671. - filename = filepath.Clean(filename) - if !filepath.IsAbs(filename) { - filename = filepath.Join(s.dir, filename) - } - } - - s.file.AddLineColumnInfo(next, filename, line, col) -} - -func trailingDigits(text []byte) (int, int, bool) { - i := bytes.LastIndexByte(text, ':') // look from right (Windows filenames may contain ':') - if i < 0 { - return 0, 0, false // no ":" - } - // i >= 0 - n, err := strconv.ParseUint(string(text[i+1:]), 10, 0) - return i + 1, int(n), err == nil -} - -func (s *Scanner) findLineEnd() bool { - // initial '/' already consumed - - defer func(offs int) { - // reset scanner state to where it was upon calling findLineEnd - s.ch = '/' - s.offset = offs - s.rdOffset = offs + 1 - s.next() // consume initial '/' again - }(s.offset - 1) - - // read ahead until a newline, EOF, or non-comment token is found - for s.ch == '/' || s.ch == '*' { - if s.ch == '/' { - //-style comment always contains a newline - return true - } - /*-style comment: look for newline */ - s.next() - for s.ch >= 0 { - ch := s.ch - if ch == '\n' { - return true - } - s.next() - if ch == '*' && s.ch == '/' { - s.next() - break - } - } - s.skipWhitespace() // s.insertSemi is set - if s.ch < 0 || s.ch == '\n' { - return true - } - if s.ch != '/' { - // non-comment token - return false - } - s.next() // consume '/' - } - - return false -} - -func isLetter(ch rune) bool { - return 'a' <= lower(ch) && lower(ch) <= 'z' || ch == '_' || ch >= utf8.RuneSelf && unicode.IsLetter(ch) -} - -func isDigit(ch rune) bool { - return isDecimal(ch) || ch >= utf8.RuneSelf && unicode.IsDigit(ch) -} - -// scanIdentifier reads the string of valid identifier characters at s.offset. -// It must only be called when s.ch is known to be a valid letter. -// -// Be careful when making changes to this function: it is optimized and affects -// scanning performance significantly. -func (s *Scanner) scanIdentifier() string { - offs := s.offset - - // Optimize for the common case of an ASCII identifier. - // - // Ranging over s.src[s.rdOffset:] lets us avoid some bounds checks, and - // avoids conversions to runes. - // - // In case we encounter a non-ASCII character, fall back on the slower path - // of calling into s.next(). - for rdOffset, b := range s.src[s.rdOffset:] { - if 'a' <= b && b <= 'z' || 'A' <= b && b <= 'Z' || b == '_' || '0' <= b && b <= '9' { - // Avoid assigning a rune for the common case of an ascii character. - continue - } - s.rdOffset += rdOffset - if 0 < b && b < utf8.RuneSelf { - // Optimization: we've encountered an ASCII character that's not a letter - // or number. Avoid the call into s.next() and corresponding set up. - // - // Note that s.next() does some line accounting if s.ch is '\n', so this - // shortcut is only possible because we know that the preceding character - // is not '\n'. - s.ch = rune(b) - s.offset = s.rdOffset - s.rdOffset++ - goto exit - } - // We know that the preceding character is valid for an identifier because - // scanIdentifier is only called when s.ch is a letter, so calling s.next() - // at s.rdOffset resets the scanner state. - s.next() - for isLetter(s.ch) || isDigit(s.ch) { - s.next() - } - goto exit - } - s.offset = len(s.src) - s.rdOffset = len(s.src) - s.ch = eof - -exit: - return string(s.src[offs:s.offset]) -} - -func digitVal(ch rune) int { - switch { - case '0' <= ch && ch <= '9': - return int(ch - '0') - case 'a' <= lower(ch) && lower(ch) <= 'f': - return int(lower(ch) - 'a' + 10) - } - return 16 // larger than any legal digit val -} - -func lower(ch rune) rune { return ('a' - 'A') | ch } // returns lower-case ch iff ch is ASCII letter -func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' } -func isHex(ch rune) bool { return '0' <= ch && ch <= '9' || 'a' <= lower(ch) && lower(ch) <= 'f' } - -// digits accepts the sequence { digit | '_' }. -// If base <= 10, digits accepts any decimal digit but records -// the offset (relative to the source start) of a digit >= base -// in *invalid, if *invalid < 0. -// digits returns a bitset describing whether the sequence contained -// digits (bit 0 is set), or separators '_' (bit 1 is set). -func (s *Scanner) digits(base int, invalid *int) (digsep int) { - if base <= 10 { - max := rune('0' + base) - for isDecimal(s.ch) || s.ch == '_' { - ds := 1 - if s.ch == '_' { - ds = 2 - } else if s.ch >= max && *invalid < 0 { - *invalid = s.offset // record invalid rune offset - } - digsep |= ds - s.next() - } - } else { - for isHex(s.ch) || s.ch == '_' { - ds := 1 - if s.ch == '_' { - ds = 2 - } - digsep |= ds - s.next() - } - } - return -} - -func (s *Scanner) scanNumber() (token.Token, string) { - offs := s.offset - tok := token.ILLEGAL - - base := 10 // number base - prefix := rune(0) // one of 0 (decimal), '0' (0-octal), 'x', 'o', or 'b' - digsep := 0 // bit 0: digit present, bit 1: '_' present - invalid := -1 // index of invalid digit in literal, or < 0 - - // integer part - if s.ch != '.' { - tok = token.INT - if s.ch == '0' { - s.next() - switch lower(s.ch) { - case 'x': - s.next() - base, prefix = 16, 'x' - case 'o': - s.next() - base, prefix = 8, 'o' - case 'b': - s.next() - base, prefix = 2, 'b' - default: - base, prefix = 8, '0' - digsep = 1 // leading 0 - } - } - digsep |= s.digits(base, &invalid) - } - - // fractional part - if s.ch == '.' { - tok = token.FLOAT - if prefix == 'o' || prefix == 'b' { - s.error(s.offset, "invalid radix point in "+litname(prefix)) - } - s.next() - digsep |= s.digits(base, &invalid) - } - - if digsep&1 == 0 { - s.error(s.offset, litname(prefix)+" has no digits") - } - - // exponent - if e := lower(s.ch); e == 'e' || e == 'p' { - switch { - case e == 'e' && prefix != 0 && prefix != '0': - s.errorf(s.offset, "%q exponent requires decimal mantissa", s.ch) - case e == 'p' && prefix != 'x': - s.errorf(s.offset, "%q exponent requires hexadecimal mantissa", s.ch) - } - s.next() - tok = token.FLOAT - if s.ch == '+' || s.ch == '-' { - s.next() - } - ds := s.digits(10, nil) - digsep |= ds - if ds&1 == 0 { - s.error(s.offset, "exponent has no digits") - } - } else if prefix == 'x' && tok == token.FLOAT { - s.error(s.offset, "hexadecimal mantissa requires a 'p' exponent") - } - - // suffix 'i' - if s.ch == 'i' { - tok = token.IMAG - s.next() - } - - lit := string(s.src[offs:s.offset]) - if tok == token.INT && invalid >= 0 { - s.errorf(invalid, "invalid digit %q in %s", lit[invalid-offs], litname(prefix)) - } - if digsep&2 != 0 { - if i := invalidSep(lit); i >= 0 { - s.error(offs+i, "'_' must separate successive digits") - } - } - - return tok, lit -} - -func litname(prefix rune) string { - switch prefix { - case 'x': - return "hexadecimal literal" - case 'o', '0': - return "octal literal" - case 'b': - return "binary literal" - } - return "decimal literal" -} - -// invalidSep returns the index of the first invalid separator in x, or -1. -func invalidSep(x string) int { - x1 := ' ' // prefix char, we only care if it's 'x' - d := '.' // digit, one of '_', '0' (a digit), or '.' (anything else) - i := 0 - - // a prefix counts as a digit - if len(x) >= 2 && x[0] == '0' { - x1 = lower(rune(x[1])) - if x1 == 'x' || x1 == 'o' || x1 == 'b' { - d = '0' - i = 2 - } - } - - // mantissa and exponent - for ; i < len(x); i++ { - p := d // previous digit - d = rune(x[i]) - switch { - case d == '_': - if p != '0' { - return i - } - case isDecimal(d) || x1 == 'x' && isHex(d): - d = '0' - default: - if p == '_' { - return i - 1 - } - d = '.' - } - } - if d == '_' { - return len(x) - 1 - } - - return -1 -} - -// scanEscape parses an escape sequence where rune is the accepted -// escaped quote. In case of a syntax error, it stops at the offending -// character (without consuming it) and returns false. Otherwise -// it returns true. -func (s *Scanner) scanEscape(quote rune) bool { - offs := s.offset - - var n int - var base, max uint32 - switch s.ch { - case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', quote: - s.next() - return true - case '0', '1', '2', '3', '4', '5', '6', '7': - n, base, max = 3, 8, 255 - case 'x': - s.next() - n, base, max = 2, 16, 255 - case 'u': - s.next() - n, base, max = 4, 16, unicode.MaxRune - case 'U': - s.next() - n, base, max = 8, 16, unicode.MaxRune - default: - msg := "unknown escape sequence" - if s.ch < 0 { - msg = "escape sequence not terminated" - } - s.error(offs, msg) - return false - } - - var x uint32 - for n > 0 { - d := uint32(digitVal(s.ch)) - if d >= base { - msg := fmt.Sprintf("illegal character %#U in escape sequence", s.ch) - if s.ch < 0 { - msg = "escape sequence not terminated" - } - s.error(s.offset, msg) - return false - } - x = x*base + d - s.next() - n-- - } - - if x > max || 0xD800 <= x && x < 0xE000 { - s.error(offs, "escape sequence is invalid Unicode code point") - return false - } - - return true -} - -func (s *Scanner) scanRune() string { - // '\'' opening already consumed - offs := s.offset - 1 - - valid := true - n := 0 - for { - ch := s.ch - if ch == '\n' || ch < 0 { - // only report error if we don't have one already - if valid { - s.error(offs, "rune literal not terminated") - valid = false - } - break - } - s.next() - if ch == '\'' { - break - } - n++ - if ch == '\\' { - if !s.scanEscape('\'') { - valid = false - } - // continue to read to closing quote - } - } - - if valid && n != 1 { - s.error(offs, "illegal rune literal") - } - - return string(s.src[offs:s.offset]) -} - -func (s *Scanner) scanString() string { - // '"' opening already consumed - offs := s.offset - 1 - - for { - ch := s.ch - if ch == '\n' || ch < 0 { - s.error(offs, "string literal not terminated") - break - } - s.next() - if ch == '"' { - break - } - if ch == '\\' { - s.scanEscape('"') - } - } - - return string(s.src[offs:s.offset]) -} - -func stripCR(b []byte, comment bool) []byte { - c := make([]byte, len(b)) - i := 0 - for j, ch := range b { - // In a /*-style comment, don't strip \r from *\r/ (incl. - // sequences of \r from *\r\r...\r/) since the resulting - // */ would terminate the comment too early unless the \r - // is immediately following the opening /* in which case - // it's ok because /*/ is not closed yet (issue #11151). - if ch != '\r' || comment && i > len("/*") && c[i-1] == '*' && j+1 < len(b) && b[j+1] == '/' { - c[i] = ch - i++ - } - } - return c[:i] -} - -func (s *Scanner) scanRawString() string { - // '`' opening already consumed - offs := s.offset - 1 - - hasCR := false - for { - ch := s.ch - if ch < 0 { - s.error(offs, "raw string literal not terminated") - break - } - s.next() - if ch == '`' { - break - } - if ch == '\r' { - hasCR = true - } - } - - lit := s.src[offs:s.offset] - if hasCR { - lit = stripCR(lit, false) - } - - return string(lit) -} - -func (s *Scanner) skipWhitespace() { - for s.ch == ' ' || s.ch == '\t' || s.ch == '\n' && !s.insertSemi || s.ch == '\r' { - s.next() - } -} - -// Helper functions for scanning multi-byte tokens such as >> += >>= . -// Different routines recognize different length tok_i based on matches -// of ch_i. If a token ends in '=', the result is tok1 or tok3 -// respectively. Otherwise, the result is tok0 if there was no other -// matching character, or tok2 if the matching character was ch2. - -func (s *Scanner) switch2(tok0, tok1 token.Token) token.Token { - if s.ch == '=' { - s.next() - return tok1 - } - return tok0 -} - -func (s *Scanner) switch3(tok0, tok1 token.Token, ch2 rune, tok2 token.Token) token.Token { - if s.ch == '=' { - s.next() - return tok1 - } - if s.ch == ch2 { - s.next() - return tok2 - } - return tok0 -} - -func (s *Scanner) switch4(tok0, tok1 token.Token, ch2 rune, tok2, tok3 token.Token) token.Token { - if s.ch == '=' { - s.next() - return tok1 - } - if s.ch == ch2 { - s.next() - if s.ch == '=' { - s.next() - return tok3 - } - return tok2 - } - return tok0 -} - -// Scan scans the next token and returns the token position, the token, -// and its literal string if applicable. The source end is indicated by -// token.EOF. -// -// If the returned token is a literal (token.IDENT, token.INT, token.FLOAT, -// token.IMAG, token.CHAR, token.STRING) or token.COMMENT, the literal string -// has the corresponding value. -// -// If the returned token is a keyword, the literal string is the keyword. -// -// If the returned token is token.SEMICOLON, the corresponding -// literal string is ";" if the semicolon was present in the source, -// and "\n" if the semicolon was inserted because of a newline or -// at EOF. -// -// If the returned token is token.ILLEGAL, the literal string is the -// offending character. -// -// In all other cases, Scan returns an empty literal string. -// -// For more tolerant parsing, Scan will return a valid token if -// possible even if a syntax error was encountered. Thus, even -// if the resulting token sequence contains no illegal tokens, -// a client may not assume that no error occurred. Instead it -// must check the scanner's ErrorCount or the number of calls -// of the error handler, if there was one installed. -// -// Scan adds line information to the file added to the file -// set with Init. Token positions are relative to that file -// and thus relative to the file set. -func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string) { -scanAgain: - s.skipWhitespace() - - // current token start - pos = s.file.Pos(s.offset) - - // determine token value - insertSemi := false - switch ch := s.ch; { - case isLetter(ch): - lit = s.scanIdentifier() - if len(lit) > 1 { - // keywords are longer than one letter - avoid lookup otherwise - tok = token.Lookup(lit) - switch tok { - case token.IDENT, token.BREAK, token.CONTINUE, token.FALLTHROUGH, token.RETURN: - insertSemi = true - } - } else { - insertSemi = true - tok = token.IDENT - } - case isDecimal(ch) || ch == '.' && isDecimal(rune(s.peek())): - insertSemi = true - tok, lit = s.scanNumber() - default: - s.next() // always make progress - switch ch { - case -1: - if s.insertSemi { - s.insertSemi = false // EOF consumed - return pos, token.SEMICOLON, "\n" - } - tok = token.EOF - case '\n': - // we only reach here if s.insertSemi was - // set in the first place and exited early - // from s.skipWhitespace() - s.insertSemi = false // newline consumed - return pos, token.SEMICOLON, "\n" - case '"': - insertSemi = true - tok = token.STRING - lit = s.scanString() - case '\'': - insertSemi = true - tok = token.CHAR - lit = s.scanRune() - case '`': - insertSemi = true - tok = token.STRING - lit = s.scanRawString() - case ':': - tok = s.switch2(token.COLON, token.DEFINE) - case '.': - // fractions starting with a '.' are handled by outer switch - tok = token.PERIOD - if s.ch == '.' && s.peek() == '.' { - s.next() - s.next() // consume last '.' - tok = token.ELLIPSIS - } - case ',': - tok = token.COMMA - case ';': - tok = token.SEMICOLON - lit = ";" - case '(': - tok = token.LPAREN - case ')': - insertSemi = true - tok = token.RPAREN - case '[': - tok = token.LBRACK - case ']': - insertSemi = true - tok = token.RBRACK - case '{': - tok = token.LBRACE - case '}': - insertSemi = true - tok = token.RBRACE - case '+': - tok = s.switch3(token.ADD, token.ADD_ASSIGN, '+', token.INC) - if tok == token.INC { - insertSemi = true - } - case '-': - tok = s.switch3(token.SUB, token.SUB_ASSIGN, '-', token.DEC) - if tok == token.DEC { - insertSemi = true - } - case '*': - tok = s.switch2(token.MUL, token.MUL_ASSIGN) - case '/': - if s.ch == '/' || s.ch == '*' { - // comment - if s.insertSemi && s.findLineEnd() { - // reset position to the beginning of the comment - s.ch = '/' - s.offset = s.file.Offset(pos) - s.rdOffset = s.offset + 1 - s.insertSemi = false // newline consumed - return pos, token.SEMICOLON, "\n" - } - comment := s.scanComment() - if s.mode&ScanComments == 0 { - // skip comment - s.insertSemi = false // newline consumed - goto scanAgain - } - tok = token.COMMENT - lit = comment - } else { - tok = s.switch2(token.QUO, token.QUO_ASSIGN) - } - case '%': - tok = s.switch2(token.REM, token.REM_ASSIGN) - case '^': - tok = s.switch2(token.XOR, token.XOR_ASSIGN) - case '<': - if s.ch == '-' { - s.next() - tok = token.ARROW - } else { - tok = s.switch4(token.LSS, token.LEQ, '<', token.SHL, token.SHL_ASSIGN) - } - case '>': - tok = s.switch4(token.GTR, token.GEQ, '>', token.SHR, token.SHR_ASSIGN) - case '=': - tok = s.switch2(token.ASSIGN, token.EQL) - case '!': - tok = s.switch2(token.NOT, token.NEQ) - case '&': - if s.ch == '^' { - s.next() - tok = s.switch2(token.AND_NOT, token.AND_NOT_ASSIGN) - } else { - tok = s.switch3(token.AND, token.AND_ASSIGN, '&', token.LAND) - } - case '|': - tok = s.switch3(token.OR, token.OR_ASSIGN, '|', token.LOR) - case '~': - tok = token.TILDE - default: - // next reports unexpected BOMs - don't repeat - if ch != bom { - s.errorf(s.file.Offset(pos), "illegal character %#U", ch) - } - insertSemi = s.insertSemi // preserve insertSemi info - tok = token.ILLEGAL - lit = string(ch) - } - } - if s.mode&dontInsertSemis == 0 { - s.insertSemi = insertSemi - } - - return -} diff --git a/internal/backport/go/scanner/scanner_test.go b/internal/backport/go/scanner/scanner_test.go deleted file mode 100644 index d56abcb9db..0000000000 --- a/internal/backport/go/scanner/scanner_test.go +++ /dev/null @@ -1,1127 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package scanner - -import ( - "golang.org/x/website/internal/backport/go/token" - "os" - "path/filepath" - "runtime" - "strings" - "testing" -) - -var fset = token.NewFileSet() - -const /* class */ ( - special = iota - literal - operator - keyword -) - -func tokenclass(tok token.Token) int { - switch { - case tok.IsLiteral(): - return literal - case tok.IsOperator(): - return operator - case tok.IsKeyword(): - return keyword - } - return special -} - -type elt struct { - tok token.Token - lit string - class int -} - -var tokens = []elt{ - // Special tokens - {token.COMMENT, "/* a comment */", special}, - {token.COMMENT, "// a comment \n", special}, - {token.COMMENT, "/*\r*/", special}, - {token.COMMENT, "/**\r/*/", special}, // issue 11151 - {token.COMMENT, "/**\r\r/*/", special}, - {token.COMMENT, "//\r\n", special}, - - // Identifiers and basic type literals - {token.IDENT, "foobar", literal}, - {token.IDENT, "a۰۱۸", literal}, - {token.IDENT, "foo६४", literal}, - {token.IDENT, "bar9876", literal}, - {token.IDENT, "ŝ", literal}, // was bug (issue 4000) - {token.IDENT, "ŝfoo", literal}, // was bug (issue 4000) - {token.INT, "0", literal}, - {token.INT, "1", literal}, - {token.INT, "123456789012345678890", literal}, - {token.INT, "01234567", literal}, - {token.INT, "0xcafebabe", literal}, - {token.FLOAT, "0.", literal}, - {token.FLOAT, ".0", literal}, - {token.FLOAT, "3.14159265", literal}, - {token.FLOAT, "1e0", literal}, - {token.FLOAT, "1e+100", literal}, - {token.FLOAT, "1e-100", literal}, - {token.FLOAT, "2.71828e-1000", literal}, - {token.IMAG, "0i", literal}, - {token.IMAG, "1i", literal}, - {token.IMAG, "012345678901234567889i", literal}, - {token.IMAG, "123456789012345678890i", literal}, - {token.IMAG, "0.i", literal}, - {token.IMAG, ".0i", literal}, - {token.IMAG, "3.14159265i", literal}, - {token.IMAG, "1e0i", literal}, - {token.IMAG, "1e+100i", literal}, - {token.IMAG, "1e-100i", literal}, - {token.IMAG, "2.71828e-1000i", literal}, - {token.CHAR, "'a'", literal}, - {token.CHAR, "'\\000'", literal}, - {token.CHAR, "'\\xFF'", literal}, - {token.CHAR, "'\\uff16'", literal}, - {token.CHAR, "'\\U0000ff16'", literal}, - {token.STRING, "`foobar`", literal}, - {token.STRING, "`" + `foo - bar` + - "`", - literal, - }, - {token.STRING, "`\r`", literal}, - {token.STRING, "`foo\r\nbar`", literal}, - - // Operators and delimiters - {token.ADD, "+", operator}, - {token.SUB, "-", operator}, - {token.MUL, "*", operator}, - {token.QUO, "/", operator}, - {token.REM, "%", operator}, - - {token.AND, "&", operator}, - {token.OR, "|", operator}, - {token.XOR, "^", operator}, - {token.SHL, "<<", operator}, - {token.SHR, ">>", operator}, - {token.AND_NOT, "&^", operator}, - - {token.ADD_ASSIGN, "+=", operator}, - {token.SUB_ASSIGN, "-=", operator}, - {token.MUL_ASSIGN, "*=", operator}, - {token.QUO_ASSIGN, "/=", operator}, - {token.REM_ASSIGN, "%=", operator}, - - {token.AND_ASSIGN, "&=", operator}, - {token.OR_ASSIGN, "|=", operator}, - {token.XOR_ASSIGN, "^=", operator}, - {token.SHL_ASSIGN, "<<=", operator}, - {token.SHR_ASSIGN, ">>=", operator}, - {token.AND_NOT_ASSIGN, "&^=", operator}, - - {token.LAND, "&&", operator}, - {token.LOR, "||", operator}, - {token.ARROW, "<-", operator}, - {token.INC, "++", operator}, - {token.DEC, "--", operator}, - - {token.EQL, "==", operator}, - {token.LSS, "<", operator}, - {token.GTR, ">", operator}, - {token.ASSIGN, "=", operator}, - {token.NOT, "!", operator}, - - {token.NEQ, "!=", operator}, - {token.LEQ, "<=", operator}, - {token.GEQ, ">=", operator}, - {token.DEFINE, ":=", operator}, - {token.ELLIPSIS, "...", operator}, - - {token.LPAREN, "(", operator}, - {token.LBRACK, "[", operator}, - {token.LBRACE, "{", operator}, - {token.COMMA, ",", operator}, - {token.PERIOD, ".", operator}, - - {token.RPAREN, ")", operator}, - {token.RBRACK, "]", operator}, - {token.RBRACE, "}", operator}, - {token.SEMICOLON, ";", operator}, - {token.COLON, ":", operator}, - {token.TILDE, "~", operator}, - - // Keywords - {token.BREAK, "break", keyword}, - {token.CASE, "case", keyword}, - {token.CHAN, "chan", keyword}, - {token.CONST, "const", keyword}, - {token.CONTINUE, "continue", keyword}, - - {token.DEFAULT, "default", keyword}, - {token.DEFER, "defer", keyword}, - {token.ELSE, "else", keyword}, - {token.FALLTHROUGH, "fallthrough", keyword}, - {token.FOR, "for", keyword}, - - {token.FUNC, "func", keyword}, - {token.GO, "go", keyword}, - {token.GOTO, "goto", keyword}, - {token.IF, "if", keyword}, - {token.IMPORT, "import", keyword}, - - {token.INTERFACE, "interface", keyword}, - {token.MAP, "map", keyword}, - {token.PACKAGE, "package", keyword}, - {token.RANGE, "range", keyword}, - {token.RETURN, "return", keyword}, - - {token.SELECT, "select", keyword}, - {token.STRUCT, "struct", keyword}, - {token.SWITCH, "switch", keyword}, - {token.TYPE, "type", keyword}, - {token.VAR, "var", keyword}, -} - -const whitespace = " \t \n\n\n" // to separate tokens - -var source = func() []byte { - var src []byte - for _, t := range tokens { - src = append(src, t.lit...) - src = append(src, whitespace...) - } - return src -}() - -func newlineCount(s string) int { - n := 0 - for i := 0; i < len(s); i++ { - if s[i] == '\n' { - n++ - } - } - return n -} - -func checkPos(t *testing.T, lit string, p token.Pos, expected token.Position) { - pos := fset.Position(p) - // Check cleaned filenames so that we don't have to worry about - // different os.PathSeparator values. - if pos.Filename != expected.Filename && filepath.Clean(pos.Filename) != filepath.Clean(expected.Filename) { - t.Errorf("bad filename for %q: got %s, expected %s", lit, pos.Filename, expected.Filename) - } - if pos.Offset != expected.Offset { - t.Errorf("bad position for %q: got %d, expected %d", lit, pos.Offset, expected.Offset) - } - if pos.Line != expected.Line { - t.Errorf("bad line for %q: got %d, expected %d", lit, pos.Line, expected.Line) - } - if pos.Column != expected.Column { - t.Errorf("bad column for %q: got %d, expected %d", lit, pos.Column, expected.Column) - } -} - -// Verify that calling Scan() provides the correct results. -func TestScan(t *testing.T) { - whitespace_linecount := newlineCount(whitespace) - - // error handler - eh := func(_ token.Position, msg string) { - t.Errorf("error handler called (msg = %s)", msg) - } - - // verify scan - var s Scanner - s.Init(fset.AddFile("", fset.Base(), len(source)), source, eh, ScanComments|dontInsertSemis) - - // set up expected position - epos := token.Position{ - Filename: "", - Offset: 0, - Line: 1, - Column: 1, - } - - index := 0 - for { - pos, tok, lit := s.Scan() - - // check position - if tok == token.EOF { - // correction for EOF - epos.Line = newlineCount(string(source)) - epos.Column = 2 - } - checkPos(t, lit, pos, epos) - - // check token - e := elt{token.EOF, "", special} - if index < len(tokens) { - e = tokens[index] - index++ - } - if tok != e.tok { - t.Errorf("bad token for %q: got %s, expected %s", lit, tok, e.tok) - } - - // check token class - if tokenclass(tok) != e.class { - t.Errorf("bad class for %q: got %d, expected %d", lit, tokenclass(tok), e.class) - } - - // check literal - elit := "" - switch e.tok { - case token.COMMENT: - // no CRs in comments - elit = string(stripCR([]byte(e.lit), e.lit[1] == '*')) - //-style comment literal doesn't contain newline - if elit[1] == '/' { - elit = elit[0 : len(elit)-1] - } - case token.IDENT: - elit = e.lit - case token.SEMICOLON: - elit = ";" - default: - if e.tok.IsLiteral() { - // no CRs in raw string literals - elit = e.lit - if elit[0] == '`' { - elit = string(stripCR([]byte(elit), false)) - } - } else if e.tok.IsKeyword() { - elit = e.lit - } - } - if lit != elit { - t.Errorf("bad literal for %q: got %q, expected %q", lit, lit, elit) - } - - if tok == token.EOF { - break - } - - // update position - epos.Offset += len(e.lit) + len(whitespace) - epos.Line += newlineCount(e.lit) + whitespace_linecount - - } - - if s.ErrorCount != 0 { - t.Errorf("found %d errors", s.ErrorCount) - } -} - -func TestStripCR(t *testing.T) { - for _, test := range []struct{ have, want string }{ - {"//\n", "//\n"}, - {"//\r\n", "//\n"}, - {"//\r\r\r\n", "//\n"}, - {"//\r*\r/\r\n", "//*/\n"}, - {"/**/", "/**/"}, - {"/*\r/*/", "/*/*/"}, - {"/*\r*/", "/**/"}, - {"/**\r/*/", "/**\r/*/"}, - {"/*\r/\r*\r/*/", "/*/*\r/*/"}, - {"/*\r\r\r\r*/", "/**/"}, - } { - got := string(stripCR([]byte(test.have), len(test.have) >= 2 && test.have[1] == '*')) - if got != test.want { - t.Errorf("stripCR(%q) = %q; want %q", test.have, got, test.want) - } - } -} - -func checkSemi(t *testing.T, line string, mode Mode) { - var S Scanner - file := fset.AddFile("TestSemis", fset.Base(), len(line)) - S.Init(file, []byte(line), nil, mode) - pos, tok, lit := S.Scan() - for tok != token.EOF { - if tok == token.ILLEGAL { - // the illegal token literal indicates what - // kind of semicolon literal to expect - semiLit := "\n" - if lit[0] == '#' { - semiLit = ";" - } - // next token must be a semicolon - semiPos := file.Position(pos) - semiPos.Offset++ - semiPos.Column++ - pos, tok, lit = S.Scan() - if tok == token.SEMICOLON { - if lit != semiLit { - t.Errorf(`bad literal for %q: got %q, expected %q`, line, lit, semiLit) - } - checkPos(t, line, pos, semiPos) - } else { - t.Errorf("bad token for %q: got %s, expected ;", line, tok) - } - } else if tok == token.SEMICOLON { - t.Errorf("bad token for %q: got ;, expected no ;", line) - } - pos, tok, lit = S.Scan() - } -} - -var lines = []string{ - // # indicates a semicolon present in the source - // $ indicates an automatically inserted semicolon - "", - "\ufeff#;", // first BOM is ignored - "#;", - "foo$\n", - "123$\n", - "1.2$\n", - "'x'$\n", - `"x"` + "$\n", - "`x`$\n", - - "+\n", - "-\n", - "*\n", - "/\n", - "%\n", - - "&\n", - "|\n", - "^\n", - "<<\n", - ">>\n", - "&^\n", - - "+=\n", - "-=\n", - "*=\n", - "/=\n", - "%=\n", - - "&=\n", - "|=\n", - "^=\n", - "<<=\n", - ">>=\n", - "&^=\n", - - "&&\n", - "||\n", - "<-\n", - "++$\n", - "--$\n", - - "==\n", - "<\n", - ">\n", - "=\n", - "!\n", - - "!=\n", - "<=\n", - ">=\n", - ":=\n", - "...\n", - - "(\n", - "[\n", - "{\n", - ",\n", - ".\n", - - ")$\n", - "]$\n", - "}$\n", - "#;\n", - ":\n", - - "break$\n", - "case\n", - "chan\n", - "const\n", - "continue$\n", - - "default\n", - "defer\n", - "else\n", - "fallthrough$\n", - "for\n", - - "func\n", - "go\n", - "goto\n", - "if\n", - "import\n", - - "interface\n", - "map\n", - "package\n", - "range\n", - "return$\n", - - "select\n", - "struct\n", - "switch\n", - "type\n", - "var\n", - - "foo$//comment\n", - "foo$//comment", - "foo$/*comment*/\n", - "foo$/*\n*/", - "foo$/*comment*/ \n", - "foo$/*\n*/ ", - - "foo $// comment\n", - "foo $// comment", - "foo $/*comment*/\n", - "foo $/*\n*/", - "foo $/* */ /* \n */ bar$/**/\n", - "foo $/*0*/ /*1*/ /*2*/\n", - - "foo $/*comment*/ \n", - "foo $/*0*/ /*1*/ /*2*/ \n", - "foo $/**/ /*-------------*/ /*----\n*/bar $/* \n*/baa$\n", - "foo $/* an EOF terminates a line */", - "foo $/* an EOF terminates a line */ /*", - "foo $/* an EOF terminates a line */ //", - - "package main$\n\nfunc main() {\n\tif {\n\t\treturn /* */ }$\n}$\n", - "package main$", -} - -func TestSemis(t *testing.T) { - for _, line := range lines { - checkSemi(t, line, 0) - checkSemi(t, line, ScanComments) - - // if the input ended in newlines, the input must tokenize the - // same with or without those newlines - for i := len(line) - 1; i >= 0 && line[i] == '\n'; i-- { - checkSemi(t, line[0:i], 0) - checkSemi(t, line[0:i], ScanComments) - } - } -} - -type segment struct { - srcline string // a line of source text - filename string // filename for current token; error message for invalid line directives - line, column int // line and column for current token; error position for invalid line directives -} - -var segments = []segment{ - // exactly one token per line since the test consumes one token per segment - {" line1", "TestLineDirectives", 1, 3}, - {"\nline2", "TestLineDirectives", 2, 1}, - {"\nline3 //line File1.go:100", "TestLineDirectives", 3, 1}, // bad line comment, ignored - {"\nline4", "TestLineDirectives", 4, 1}, - {"\n//line File1.go:100\n line100", "File1.go", 100, 0}, - {"\n//line \t :42\n line1", " \t ", 42, 0}, - {"\n//line File2.go:200\n line200", "File2.go", 200, 0}, - {"\n//line foo\t:42\n line42", "foo\t", 42, 0}, - {"\n //line foo:42\n line43", "foo\t", 44, 0}, // bad line comment, ignored (use existing, prior filename) - {"\n//line foo 42\n line44", "foo\t", 46, 0}, // bad line comment, ignored (use existing, prior filename) - {"\n//line /bar:42\n line45", "/bar", 42, 0}, - {"\n//line ./foo:42\n line46", "foo", 42, 0}, - {"\n//line a/b/c/File1.go:100\n line100", "a/b/c/File1.go", 100, 0}, - {"\n//line c:\\bar:42\n line200", "c:\\bar", 42, 0}, - {"\n//line c:\\dir\\File1.go:100\n line201", "c:\\dir\\File1.go", 100, 0}, - - // tests for new line directive syntax - {"\n//line :100\na1", "", 100, 0}, // missing filename means empty filename - {"\n//line bar:100\nb1", "bar", 100, 0}, - {"\n//line :100:10\nc1", "bar", 100, 10}, // missing filename means current filename - {"\n//line foo:100:10\nd1", "foo", 100, 10}, - - {"\n/*line :100*/a2", "", 100, 0}, // missing filename means empty filename - {"\n/*line bar:100*/b2", "bar", 100, 0}, - {"\n/*line :100:10*/c2", "bar", 100, 10}, // missing filename means current filename - {"\n/*line foo:100:10*/d2", "foo", 100, 10}, - {"\n/*line foo:100:10*/ e2", "foo", 100, 14}, // line-directive relative column - {"\n/*line foo:100:10*/\n\nf2", "foo", 102, 1}, // absolute column since on new line -} - -var dirsegments = []segment{ - // exactly one token per line since the test consumes one token per segment - {" line1", "TestLineDir/TestLineDirectives", 1, 3}, - {"\n//line File1.go:100\n line100", "TestLineDir/File1.go", 100, 0}, -} - -var dirUnixSegments = []segment{ - {"\n//line /bar:42\n line42", "/bar", 42, 0}, -} - -var dirWindowsSegments = []segment{ - {"\n//line c:\\bar:42\n line42", "c:\\bar", 42, 0}, -} - -// Verify that line directives are interpreted correctly. -func TestLineDirectives(t *testing.T) { - testSegments(t, segments, "TestLineDirectives") - testSegments(t, dirsegments, "TestLineDir/TestLineDirectives") - if runtime.GOOS == "windows" { - testSegments(t, dirWindowsSegments, "TestLineDir/TestLineDirectives") - } else { - testSegments(t, dirUnixSegments, "TestLineDir/TestLineDirectives") - } -} - -func testSegments(t *testing.T, segments []segment, filename string) { - var src string - for _, e := range segments { - src += e.srcline - } - - // verify scan - var S Scanner - file := fset.AddFile(filename, fset.Base(), len(src)) - S.Init(file, []byte(src), func(pos token.Position, msg string) { t.Error(Error{pos, msg}) }, dontInsertSemis) - for _, s := range segments { - p, _, lit := S.Scan() - pos := file.Position(p) - checkPos(t, lit, p, token.Position{ - Filename: s.filename, - Offset: pos.Offset, - Line: s.line, - Column: s.column, - }) - } - - if S.ErrorCount != 0 { - t.Errorf("got %d errors", S.ErrorCount) - } -} - -// The filename is used for the error message in these test cases. -// The first line directive is valid and used to control the expected error line. -var invalidSegments = []segment{ - {"\n//line :1:1\n//line foo:42 extra text\ndummy", "invalid line number: 42 extra text", 1, 12}, - {"\n//line :2:1\n//line foobar:\ndummy", "invalid line number: ", 2, 15}, - {"\n//line :5:1\n//line :0\ndummy", "invalid line number: 0", 5, 9}, - {"\n//line :10:1\n//line :1:0\ndummy", "invalid column number: 0", 10, 11}, - {"\n//line :1:1\n//line :foo:0\ndummy", "invalid line number: 0", 1, 13}, // foo is considered part of the filename -} - -// Verify that invalid line directives get the correct error message. -func TestInvalidLineDirectives(t *testing.T) { - // make source - var src string - for _, e := range invalidSegments { - src += e.srcline - } - - // verify scan - var S Scanner - var s segment // current segment - file := fset.AddFile(filepath.Join("dir", "TestInvalidLineDirectives"), fset.Base(), len(src)) - S.Init(file, []byte(src), func(pos token.Position, msg string) { - if msg != s.filename { - t.Errorf("got error %q; want %q", msg, s.filename) - } - if pos.Line != s.line || pos.Column != s.column { - t.Errorf("got position %d:%d; want %d:%d", pos.Line, pos.Column, s.line, s.column) - } - }, dontInsertSemis) - for _, s = range invalidSegments { - S.Scan() - } - - if S.ErrorCount != len(invalidSegments) { - t.Errorf("got %d errors; want %d", S.ErrorCount, len(invalidSegments)) - } -} - -// Verify that initializing the same scanner more than once works correctly. -func TestInit(t *testing.T) { - var s Scanner - - // 1st init - src1 := "if true { }" - f1 := fset.AddFile("src1", fset.Base(), len(src1)) - s.Init(f1, []byte(src1), nil, dontInsertSemis) - if f1.Size() != len(src1) { - t.Errorf("bad file size: got %d, expected %d", f1.Size(), len(src1)) - } - s.Scan() // if - s.Scan() // true - _, tok, _ := s.Scan() // { - if tok != token.LBRACE { - t.Errorf("bad token: got %s, expected %s", tok, token.LBRACE) - } - - // 2nd init - src2 := "go true { ]" - f2 := fset.AddFile("src2", fset.Base(), len(src2)) - s.Init(f2, []byte(src2), nil, dontInsertSemis) - if f2.Size() != len(src2) { - t.Errorf("bad file size: got %d, expected %d", f2.Size(), len(src2)) - } - _, tok, _ = s.Scan() // go - if tok != token.GO { - t.Errorf("bad token: got %s, expected %s", tok, token.GO) - } - - if s.ErrorCount != 0 { - t.Errorf("found %d errors", s.ErrorCount) - } -} - -func TestStdErrorHander(t *testing.T) { - const src = "@\n" + // illegal character, cause an error - "@ @\n" + // two errors on the same line - "//line File2:20\n" + - "@\n" + // different file, but same line - "//line File2:1\n" + - "@ @\n" + // same file, decreasing line number - "//line File1:1\n" + - "@ @ @" // original file, line 1 again - - var list ErrorList - eh := func(pos token.Position, msg string) { list.Add(pos, msg) } - - var s Scanner - s.Init(fset.AddFile("File1", fset.Base(), len(src)), []byte(src), eh, dontInsertSemis) - for { - if _, tok, _ := s.Scan(); tok == token.EOF { - break - } - } - - if len(list) != s.ErrorCount { - t.Errorf("found %d errors, expected %d", len(list), s.ErrorCount) - } - - if len(list) != 9 { - t.Errorf("found %d raw errors, expected 9", len(list)) - PrintError(os.Stderr, list) - } - - list.Sort() - if len(list) != 9 { - t.Errorf("found %d sorted errors, expected 9", len(list)) - PrintError(os.Stderr, list) - } - - list.RemoveMultiples() - if len(list) != 4 { - t.Errorf("found %d one-per-line errors, expected 4", len(list)) - PrintError(os.Stderr, list) - } -} - -type errorCollector struct { - cnt int // number of errors encountered - msg string // last error message encountered - pos token.Position // last error position encountered -} - -func checkError(t *testing.T, src string, tok token.Token, pos int, lit, err string) { - var s Scanner - var h errorCollector - eh := func(pos token.Position, msg string) { - h.cnt++ - h.msg = msg - h.pos = pos - } - s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), eh, ScanComments|dontInsertSemis) - _, tok0, lit0 := s.Scan() - if tok0 != tok { - t.Errorf("%q: got %s, expected %s", src, tok0, tok) - } - if tok0 != token.ILLEGAL && lit0 != lit { - t.Errorf("%q: got literal %q, expected %q", src, lit0, lit) - } - cnt := 0 - if err != "" { - cnt = 1 - } - if h.cnt != cnt { - t.Errorf("%q: got cnt %d, expected %d", src, h.cnt, cnt) - } - if h.msg != err { - t.Errorf("%q: got msg %q, expected %q", src, h.msg, err) - } - if h.pos.Offset != pos { - t.Errorf("%q: got offset %d, expected %d", src, h.pos.Offset, pos) - } -} - -var errors = []struct { - src string - tok token.Token - pos int - lit string - err string -}{ - {"\a", token.ILLEGAL, 0, "", "illegal character U+0007"}, - {`#`, token.ILLEGAL, 0, "", "illegal character U+0023 '#'"}, - {`…`, token.ILLEGAL, 0, "", "illegal character U+2026 '…'"}, - {"..", token.PERIOD, 0, "", ""}, // two periods, not invalid token (issue #28112) - {`' '`, token.CHAR, 0, `' '`, ""}, - {`''`, token.CHAR, 0, `''`, "illegal rune literal"}, - {`'12'`, token.CHAR, 0, `'12'`, "illegal rune literal"}, - {`'123'`, token.CHAR, 0, `'123'`, "illegal rune literal"}, - {`'\0'`, token.CHAR, 3, `'\0'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\07'`, token.CHAR, 4, `'\07'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\8'`, token.CHAR, 2, `'\8'`, "unknown escape sequence"}, - {`'\08'`, token.CHAR, 3, `'\08'`, "illegal character U+0038 '8' in escape sequence"}, - {`'\x'`, token.CHAR, 3, `'\x'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\x0'`, token.CHAR, 4, `'\x0'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\x0g'`, token.CHAR, 4, `'\x0g'`, "illegal character U+0067 'g' in escape sequence"}, - {`'\u'`, token.CHAR, 3, `'\u'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\u0'`, token.CHAR, 4, `'\u0'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\u00'`, token.CHAR, 5, `'\u00'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\u000'`, token.CHAR, 6, `'\u000'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\u000`, token.CHAR, 6, `'\u000`, "escape sequence not terminated"}, - {`'\u0000'`, token.CHAR, 0, `'\u0000'`, ""}, - {`'\U'`, token.CHAR, 3, `'\U'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U0'`, token.CHAR, 4, `'\U0'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U00'`, token.CHAR, 5, `'\U00'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U000'`, token.CHAR, 6, `'\U000'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U0000'`, token.CHAR, 7, `'\U0000'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U00000'`, token.CHAR, 8, `'\U00000'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U000000'`, token.CHAR, 9, `'\U000000'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U0000000'`, token.CHAR, 10, `'\U0000000'`, "illegal character U+0027 ''' in escape sequence"}, - {`'\U0000000`, token.CHAR, 10, `'\U0000000`, "escape sequence not terminated"}, - {`'\U00000000'`, token.CHAR, 0, `'\U00000000'`, ""}, - {`'\Uffffffff'`, token.CHAR, 2, `'\Uffffffff'`, "escape sequence is invalid Unicode code point"}, - {`'`, token.CHAR, 0, `'`, "rune literal not terminated"}, - {`'\`, token.CHAR, 2, `'\`, "escape sequence not terminated"}, - {"'\n", token.CHAR, 0, "'", "rune literal not terminated"}, - {"'\n ", token.CHAR, 0, "'", "rune literal not terminated"}, - {`""`, token.STRING, 0, `""`, ""}, - {`"abc`, token.STRING, 0, `"abc`, "string literal not terminated"}, - {"\"abc\n", token.STRING, 0, `"abc`, "string literal not terminated"}, - {"\"abc\n ", token.STRING, 0, `"abc`, "string literal not terminated"}, - {"``", token.STRING, 0, "``", ""}, - {"`", token.STRING, 0, "`", "raw string literal not terminated"}, - {"/**/", token.COMMENT, 0, "/**/", ""}, - {"/*", token.COMMENT, 0, "/*", "comment not terminated"}, - {"077", token.INT, 0, "077", ""}, - {"078.", token.FLOAT, 0, "078.", ""}, - {"07801234567.", token.FLOAT, 0, "07801234567.", ""}, - {"078e0", token.FLOAT, 0, "078e0", ""}, - {"0E", token.FLOAT, 2, "0E", "exponent has no digits"}, // issue 17621 - {"078", token.INT, 2, "078", "invalid digit '8' in octal literal"}, - {"07090000008", token.INT, 3, "07090000008", "invalid digit '9' in octal literal"}, - {"0x", token.INT, 2, "0x", "hexadecimal literal has no digits"}, - {"\"abc\x00def\"", token.STRING, 4, "\"abc\x00def\"", "illegal character NUL"}, - {"\"abc\x80def\"", token.STRING, 4, "\"abc\x80def\"", "illegal UTF-8 encoding"}, - {"\ufeff\ufeff", token.ILLEGAL, 3, "\ufeff\ufeff", "illegal byte order mark"}, // only first BOM is ignored - {"//\ufeff", token.COMMENT, 2, "//\ufeff", "illegal byte order mark"}, // only first BOM is ignored - {"'\ufeff" + `'`, token.CHAR, 1, "'\ufeff" + `'`, "illegal byte order mark"}, // only first BOM is ignored - {`"` + "abc\ufeffdef" + `"`, token.STRING, 4, `"` + "abc\ufeffdef" + `"`, "illegal byte order mark"}, // only first BOM is ignored - {"abc\x00def", token.IDENT, 3, "abc", "illegal character NUL"}, - {"abc\x00", token.IDENT, 3, "abc", "illegal character NUL"}, -} - -func TestScanErrors(t *testing.T) { - for _, e := range errors { - checkError(t, e.src, e.tok, e.pos, e.lit, e.err) - } -} - -// Verify that no comments show up as literal values when skipping comments. -func TestIssue10213(t *testing.T) { - const src = ` - var ( - A = 1 // foo - ) - - var ( - B = 2 - // foo - ) - - var C = 3 // foo - - var D = 4 - // foo - - func anycode() { - // foo - } - ` - var s Scanner - s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), nil, 0) - for { - pos, tok, lit := s.Scan() - class := tokenclass(tok) - if lit != "" && class != keyword && class != literal && tok != token.SEMICOLON { - t.Errorf("%s: tok = %s, lit = %q", fset.Position(pos), tok, lit) - } - if tok <= token.EOF { - break - } - } -} - -func TestIssue28112(t *testing.T) { - const src = "... .. 0.. .." // make sure to have stand-alone ".." immediately before EOF to test EOF behavior - tokens := []token.Token{token.ELLIPSIS, token.PERIOD, token.PERIOD, token.FLOAT, token.PERIOD, token.PERIOD, token.PERIOD, token.EOF} - var s Scanner - s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), nil, 0) - for _, want := range tokens { - pos, got, lit := s.Scan() - if got != want { - t.Errorf("%s: got %s, want %s", fset.Position(pos), got, want) - } - // literals expect to have a (non-empty) literal string and we don't care about other tokens for this test - if tokenclass(got) == literal && lit == "" { - t.Errorf("%s: for %s got empty literal string", fset.Position(pos), got) - } - } -} - -func BenchmarkScan(b *testing.B) { - b.StopTimer() - fset := token.NewFileSet() - file := fset.AddFile("", fset.Base(), len(source)) - var s Scanner - b.StartTimer() - for i := 0; i < b.N; i++ { - s.Init(file, source, nil, ScanComments) - for { - _, tok, _ := s.Scan() - if tok == token.EOF { - break - } - } - } -} - -func BenchmarkScanFiles(b *testing.B) { - // Scan a few arbitrary large files, and one small one, to provide some - // variety in benchmarks. - for _, p := range []string{ - "golang.org/x/website/internal/backport/go/types/expr.go", - "golang.org/x/website/internal/backport/go/parser/parser.go", - "net/http/server.go", - "golang.org/x/website/internal/backport/go/scanner/errors.go", - } { - b.Run(p, func(b *testing.B) { - b.StopTimer() - filename := filepath.Join("..", "..", filepath.FromSlash(p)) - src, err := os.ReadFile(filename) - if err != nil { - b.Fatal(err) - } - fset := token.NewFileSet() - file := fset.AddFile(filename, fset.Base(), len(src)) - b.SetBytes(int64(len(src))) - var s Scanner - b.StartTimer() - for i := 0; i < b.N; i++ { - s.Init(file, src, nil, ScanComments) - for { - _, tok, _ := s.Scan() - if tok == token.EOF { - break - } - } - } - }) - } -} - -func TestNumbers(t *testing.T) { - for _, test := range []struct { - tok token.Token - src, tokens, err string - }{ - // binaries - {token.INT, "0b0", "0b0", ""}, - {token.INT, "0b1010", "0b1010", ""}, - {token.INT, "0B1110", "0B1110", ""}, - - {token.INT, "0b", "0b", "binary literal has no digits"}, - {token.INT, "0b0190", "0b0190", "invalid digit '9' in binary literal"}, - {token.INT, "0b01a0", "0b01 a0", ""}, // only accept 0-9 - - {token.FLOAT, "0b.", "0b.", "invalid radix point in binary literal"}, - {token.FLOAT, "0b.1", "0b.1", "invalid radix point in binary literal"}, - {token.FLOAT, "0b1.0", "0b1.0", "invalid radix point in binary literal"}, - {token.FLOAT, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"}, - {token.FLOAT, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"}, - - {token.IMAG, "0b10i", "0b10i", ""}, - {token.IMAG, "0b10.0i", "0b10.0i", "invalid radix point in binary literal"}, - - // octals - {token.INT, "0o0", "0o0", ""}, - {token.INT, "0o1234", "0o1234", ""}, - {token.INT, "0O1234", "0O1234", ""}, - - {token.INT, "0o", "0o", "octal literal has no digits"}, - {token.INT, "0o8123", "0o8123", "invalid digit '8' in octal literal"}, - {token.INT, "0o1293", "0o1293", "invalid digit '9' in octal literal"}, - {token.INT, "0o12a3", "0o12 a3", ""}, // only accept 0-9 - - {token.FLOAT, "0o.", "0o.", "invalid radix point in octal literal"}, - {token.FLOAT, "0o.2", "0o.2", "invalid radix point in octal literal"}, - {token.FLOAT, "0o1.2", "0o1.2", "invalid radix point in octal literal"}, - {token.FLOAT, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"}, - {token.FLOAT, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"}, - - {token.IMAG, "0o10i", "0o10i", ""}, - {token.IMAG, "0o10e0i", "0o10e0i", "'e' exponent requires decimal mantissa"}, - - // 0-octals - {token.INT, "0", "0", ""}, - {token.INT, "0123", "0123", ""}, - - {token.INT, "08123", "08123", "invalid digit '8' in octal literal"}, - {token.INT, "01293", "01293", "invalid digit '9' in octal literal"}, - {token.INT, "0F.", "0 F .", ""}, // only accept 0-9 - {token.INT, "0123F.", "0123 F .", ""}, - {token.INT, "0123456x", "0123456 x", ""}, - - // decimals - {token.INT, "1", "1", ""}, - {token.INT, "1234", "1234", ""}, - - {token.INT, "1f", "1 f", ""}, // only accept 0-9 - - {token.IMAG, "0i", "0i", ""}, - {token.IMAG, "0678i", "0678i", ""}, - - // decimal floats - {token.FLOAT, "0.", "0.", ""}, - {token.FLOAT, "123.", "123.", ""}, - {token.FLOAT, "0123.", "0123.", ""}, - - {token.FLOAT, ".0", ".0", ""}, - {token.FLOAT, ".123", ".123", ""}, - {token.FLOAT, ".0123", ".0123", ""}, - - {token.FLOAT, "0.0", "0.0", ""}, - {token.FLOAT, "123.123", "123.123", ""}, - {token.FLOAT, "0123.0123", "0123.0123", ""}, - - {token.FLOAT, "0e0", "0e0", ""}, - {token.FLOAT, "123e+0", "123e+0", ""}, - {token.FLOAT, "0123E-1", "0123E-1", ""}, - - {token.FLOAT, "0.e+1", "0.e+1", ""}, - {token.FLOAT, "123.E-10", "123.E-10", ""}, - {token.FLOAT, "0123.e123", "0123.e123", ""}, - - {token.FLOAT, ".0e-1", ".0e-1", ""}, - {token.FLOAT, ".123E+10", ".123E+10", ""}, - {token.FLOAT, ".0123E123", ".0123E123", ""}, - - {token.FLOAT, "0.0e1", "0.0e1", ""}, - {token.FLOAT, "123.123E-10", "123.123E-10", ""}, - {token.FLOAT, "0123.0123e+456", "0123.0123e+456", ""}, - - {token.FLOAT, "0e", "0e", "exponent has no digits"}, - {token.FLOAT, "0E+", "0E+", "exponent has no digits"}, - {token.FLOAT, "1e+f", "1e+ f", "exponent has no digits"}, - {token.FLOAT, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"}, - {token.FLOAT, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"}, - - {token.IMAG, "0.i", "0.i", ""}, - {token.IMAG, ".123i", ".123i", ""}, - {token.IMAG, "123.123i", "123.123i", ""}, - {token.IMAG, "123e+0i", "123e+0i", ""}, - {token.IMAG, "123.E-10i", "123.E-10i", ""}, - {token.IMAG, ".123E+10i", ".123E+10i", ""}, - - // hexadecimals - {token.INT, "0x0", "0x0", ""}, - {token.INT, "0x1234", "0x1234", ""}, - {token.INT, "0xcafef00d", "0xcafef00d", ""}, - {token.INT, "0XCAFEF00D", "0XCAFEF00D", ""}, - - {token.INT, "0x", "0x", "hexadecimal literal has no digits"}, - {token.INT, "0x1g", "0x1 g", ""}, - - {token.IMAG, "0xf00i", "0xf00i", ""}, - - // hexadecimal floats - {token.FLOAT, "0x0p0", "0x0p0", ""}, - {token.FLOAT, "0x12efp-123", "0x12efp-123", ""}, - {token.FLOAT, "0xABCD.p+0", "0xABCD.p+0", ""}, - {token.FLOAT, "0x.0189P-0", "0x.0189P-0", ""}, - {token.FLOAT, "0x1.ffffp+1023", "0x1.ffffp+1023", ""}, - - {token.FLOAT, "0x.", "0x.", "hexadecimal literal has no digits"}, - {token.FLOAT, "0x0.", "0x0.", "hexadecimal mantissa requires a 'p' exponent"}, - {token.FLOAT, "0x.0", "0x.0", "hexadecimal mantissa requires a 'p' exponent"}, - {token.FLOAT, "0x1.1", "0x1.1", "hexadecimal mantissa requires a 'p' exponent"}, - {token.FLOAT, "0x1.1e0", "0x1.1e0", "hexadecimal mantissa requires a 'p' exponent"}, - {token.FLOAT, "0x1.2gp1a", "0x1.2 gp1a", "hexadecimal mantissa requires a 'p' exponent"}, - {token.FLOAT, "0x0p", "0x0p", "exponent has no digits"}, - {token.FLOAT, "0xeP-", "0xeP-", "exponent has no digits"}, - {token.FLOAT, "0x1234PAB", "0x1234P AB", "exponent has no digits"}, - {token.FLOAT, "0x1.2p1a", "0x1.2p1 a", ""}, - - {token.IMAG, "0xf00.bap+12i", "0xf00.bap+12i", ""}, - - // separators - {token.INT, "0b_1000_0001", "0b_1000_0001", ""}, - {token.INT, "0o_600", "0o_600", ""}, - {token.INT, "0_466", "0_466", ""}, - {token.INT, "1_000", "1_000", ""}, - {token.FLOAT, "1_000.000_1", "1_000.000_1", ""}, - {token.IMAG, "10e+1_2_3i", "10e+1_2_3i", ""}, - {token.INT, "0x_f00d", "0x_f00d", ""}, - {token.FLOAT, "0x_f00d.0p1_2", "0x_f00d.0p1_2", ""}, - - {token.INT, "0b__1000", "0b__1000", "'_' must separate successive digits"}, - {token.INT, "0o60___0", "0o60___0", "'_' must separate successive digits"}, - {token.INT, "0466_", "0466_", "'_' must separate successive digits"}, - {token.FLOAT, "1_.", "1_.", "'_' must separate successive digits"}, - {token.FLOAT, "0._1", "0._1", "'_' must separate successive digits"}, - {token.FLOAT, "2.7_e0", "2.7_e0", "'_' must separate successive digits"}, - {token.IMAG, "10e+12_i", "10e+12_i", "'_' must separate successive digits"}, - {token.INT, "0x___0", "0x___0", "'_' must separate successive digits"}, - {token.FLOAT, "0x1.0_p0", "0x1.0_p0", "'_' must separate successive digits"}, - } { - var s Scanner - var err string - s.Init(fset.AddFile("", fset.Base(), len(test.src)), []byte(test.src), func(_ token.Position, msg string) { - if err == "" { - err = msg - } - }, 0) - for i, want := range strings.Split(test.tokens, " ") { - err = "" - _, tok, lit := s.Scan() - - // compute lit where for tokens where lit is not defined - switch tok { - case token.PERIOD: - lit = "." - case token.ADD: - lit = "+" - case token.SUB: - lit = "-" - } - - if i == 0 { - if tok != test.tok { - t.Errorf("%q: got token %s; want %s", test.src, tok, test.tok) - } - if err != test.err { - t.Errorf("%q: got error %q; want %q", test.src, err, test.err) - } - } - - if lit != want { - t.Errorf("%q: got literal %q (%s); want %s", test.src, lit, tok, want) - } - } - - // make sure we read all - _, tok, _ := s.Scan() - if tok == token.SEMICOLON { - _, tok, _ = s.Scan() - } - if tok != token.EOF { - t.Errorf("%q: got %s; want EOF", test.src, tok) - } - } -} diff --git a/internal/backport/go/token/example_test.go b/internal/backport/go/token/example_test.go deleted file mode 100644 index e41a958c68..0000000000 --- a/internal/backport/go/token/example_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package token_test - -import ( - "fmt" - "golang.org/x/website/internal/backport/go/ast" - "golang.org/x/website/internal/backport/go/parser" - "golang.org/x/website/internal/backport/go/token" -) - -func Example_retrievePositionInfo() { - fset := token.NewFileSet() - - const src = `package main - -import "fmt" - -import "go/token" - -//line :1:5 -type p = token.Pos - -const bad = token.NoPos - -//line fake.go:42:11 -func ok(pos p) bool { - return pos != bad -} - -/*line :7:9*/func main() { - fmt.Println(ok(bad) == bad.IsValid()) -} -` - - f, err := parser.ParseFile(fset, "main.go", src, 0) - if err != nil { - fmt.Println(err) - return - } - - // Print the location and kind of each declaration in f. - for _, decl := range f.Decls { - // Get the filename, line, and column back via the file set. - // We get both the relative and absolute position. - // The relative position is relative to the last line directive. - // The absolute position is the exact position in the source. - pos := decl.Pos() - relPosition := fset.Position(pos) - absPosition := fset.PositionFor(pos, false) - - // Either a FuncDecl or GenDecl, since we exit on error. - kind := "func" - if gen, ok := decl.(*ast.GenDecl); ok { - kind = gen.Tok.String() - } - - // If the relative and absolute positions differ, show both. - fmtPosition := relPosition.String() - if relPosition != absPosition { - fmtPosition += "[" + absPosition.String() + "]" - } - - fmt.Printf("%s: %s\n", fmtPosition, kind) - } - - //Output: - // - // main.go:3:1: import - // main.go:5:1: import - // main.go:1:5[main.go:8:1]: type - // main.go:3:1[main.go:10:1]: const - // fake.go:42:11[main.go:13:1]: func - // fake.go:7:9[main.go:17:14]: func -} diff --git a/internal/backport/go/token/position.go b/internal/backport/go/token/position.go deleted file mode 100644 index 00f24535bf..0000000000 --- a/internal/backport/go/token/position.go +++ /dev/null @@ -1,529 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package token - -import ( - "fmt" - "sort" - "sync" -) - -// ----------------------------------------------------------------------------- -// Positions - -// Position describes an arbitrary source position -// including the file, line, and column location. -// A Position is valid if the line number is > 0. -type Position struct { - Filename string // filename, if any - Offset int // offset, starting at 0 - Line int // line number, starting at 1 - Column int // column number, starting at 1 (byte count) -} - -// IsValid reports whether the position is valid. -func (pos *Position) IsValid() bool { return pos.Line > 0 } - -// String returns a string in one of several forms: -// -// file:line:column valid position with file name -// file:line valid position with file name but no column (column == 0) -// line:column valid position without file name -// line valid position without file name and no column (column == 0) -// file invalid position with file name -// - invalid position without file name -func (pos Position) String() string { - s := pos.Filename - if pos.IsValid() { - if s != "" { - s += ":" - } - s += fmt.Sprintf("%d", pos.Line) - if pos.Column != 0 { - s += fmt.Sprintf(":%d", pos.Column) - } - } - if s == "" { - s = "-" - } - return s -} - -// Pos is a compact encoding of a source position within a file set. -// It can be converted into a Position for a more convenient, but much -// larger, representation. -// -// The Pos value for a given file is a number in the range [base, base+size], -// where base and size are specified when a file is added to the file set. -// The difference between a Pos value and the corresponding file base -// corresponds to the byte offset of that position (represented by the Pos value) -// from the beginning of the file. Thus, the file base offset is the Pos value -// representing the first byte in the file. -// -// To create the Pos value for a specific source offset (measured in bytes), -// first add the respective file to the current file set using FileSet.AddFile -// and then call File.Pos(offset) for that file. Given a Pos value p -// for a specific file set fset, the corresponding Position value is -// obtained by calling fset.Position(p). -// -// Pos values can be compared directly with the usual comparison operators: -// If two Pos values p and q are in the same file, comparing p and q is -// equivalent to comparing the respective source file offsets. If p and q -// are in different files, p < q is true if the file implied by p was added -// to the respective file set before the file implied by q. -type Pos int - -// The zero value for Pos is NoPos; there is no file and line information -// associated with it, and NoPos.IsValid() is false. NoPos is always -// smaller than any other Pos value. The corresponding Position value -// for NoPos is the zero value for Position. -const NoPos Pos = 0 - -// IsValid reports whether the position is valid. -func (p Pos) IsValid() bool { - return p != NoPos -} - -// ----------------------------------------------------------------------------- -// File - -// A File is a handle for a file belonging to a FileSet. -// A File has a name, size, and line offset table. -type File struct { - set *FileSet - name string // file name as provided to AddFile - base int // Pos value range for this file is [base...base+size] - size int // file size as provided to AddFile - - // lines and infos are protected by mutex - mutex sync.Mutex - lines []int // lines contains the offset of the first character for each line (the first entry is always 0) - infos []lineInfo -} - -// Name returns the file name of file f as registered with AddFile. -func (f *File) Name() string { - return f.name -} - -// Base returns the base offset of file f as registered with AddFile. -func (f *File) Base() int { - return f.base -} - -// Size returns the size of file f as registered with AddFile. -func (f *File) Size() int { - return f.size -} - -// LineCount returns the number of lines in file f. -func (f *File) LineCount() int { - f.mutex.Lock() - n := len(f.lines) - f.mutex.Unlock() - return n -} - -// AddLine adds the line offset for a new line. -// The line offset must be larger than the offset for the previous line -// and smaller than the file size; otherwise the line offset is ignored. -func (f *File) AddLine(offset int) { - f.mutex.Lock() - if i := len(f.lines); (i == 0 || f.lines[i-1] < offset) && offset < f.size { - f.lines = append(f.lines, offset) - } - f.mutex.Unlock() -} - -// MergeLine merges a line with the following line. It is akin to replacing -// the newline character at the end of the line with a space (to not change the -// remaining offsets). To obtain the line number, consult e.g. Position.Line. -// MergeLine will panic if given an invalid line number. -func (f *File) MergeLine(line int) { - if line < 1 { - panic(fmt.Sprintf("invalid line number %d (should be >= 1)", line)) - } - f.mutex.Lock() - defer f.mutex.Unlock() - if line >= len(f.lines) { - panic(fmt.Sprintf("invalid line number %d (should be < %d)", line, len(f.lines))) - } - // To merge the line numbered with the line numbered , - // we need to remove the entry in lines corresponding to the line - // numbered . The entry in lines corresponding to the line - // numbered is located at index , since indices in lines - // are 0-based and line numbers are 1-based. - copy(f.lines[line:], f.lines[line+1:]) - f.lines = f.lines[:len(f.lines)-1] -} - -// SetLines sets the line offsets for a file and reports whether it succeeded. -// The line offsets are the offsets of the first character of each line; -// for instance for the content "ab\nc\n" the line offsets are {0, 3}. -// An empty file has an empty line offset table. -// Each line offset must be larger than the offset for the previous line -// and smaller than the file size; otherwise SetLines fails and returns -// false. -// Callers must not mutate the provided slice after SetLines returns. -func (f *File) SetLines(lines []int) bool { - // verify validity of lines table - size := f.size - for i, offset := range lines { - if i > 0 && offset <= lines[i-1] || size <= offset { - return false - } - } - - // set lines table - f.mutex.Lock() - f.lines = lines - f.mutex.Unlock() - return true -} - -// SetLinesForContent sets the line offsets for the given file content. -// It ignores position-altering //line comments. -func (f *File) SetLinesForContent(content []byte) { - var lines []int - line := 0 - for offset, b := range content { - if line >= 0 { - lines = append(lines, line) - } - line = -1 - if b == '\n' { - line = offset + 1 - } - } - - // set lines table - f.mutex.Lock() - f.lines = lines - f.mutex.Unlock() -} - -// LineStart returns the Pos value of the start of the specified line. -// It ignores any alternative positions set using AddLineColumnInfo. -// LineStart panics if the 1-based line number is invalid. -func (f *File) LineStart(line int) Pos { - if line < 1 { - panic(fmt.Sprintf("invalid line number %d (should be >= 1)", line)) - } - f.mutex.Lock() - defer f.mutex.Unlock() - if line > len(f.lines) { - panic(fmt.Sprintf("invalid line number %d (should be < %d)", line, len(f.lines))) - } - return Pos(f.base + f.lines[line-1]) -} - -// A lineInfo object describes alternative file, line, and column -// number information (such as provided via a //line directive) -// for a given file offset. -type lineInfo struct { - // fields are exported to make them accessible to gob - Offset int - Filename string - Line, Column int -} - -// AddLineInfo is like AddLineColumnInfo with a column = 1 argument. -// It is here for backward-compatibility for code prior to Go 1.11. -func (f *File) AddLineInfo(offset int, filename string, line int) { - f.AddLineColumnInfo(offset, filename, line, 1) -} - -// AddLineColumnInfo adds alternative file, line, and column number -// information for a given file offset. The offset must be larger -// than the offset for the previously added alternative line info -// and smaller than the file size; otherwise the information is -// ignored. -// -// AddLineColumnInfo is typically used to register alternative position -// information for line directives such as //line filename:line:column. -func (f *File) AddLineColumnInfo(offset int, filename string, line, column int) { - f.mutex.Lock() - if i := len(f.infos); i == 0 || f.infos[i-1].Offset < offset && offset < f.size { - f.infos = append(f.infos, lineInfo{offset, filename, line, column}) - } - f.mutex.Unlock() -} - -// Pos returns the Pos value for the given file offset; -// the offset must be <= f.Size(). -// f.Pos(f.Offset(p)) == p. -func (f *File) Pos(offset int) Pos { - if offset > f.size { - panic(fmt.Sprintf("invalid file offset %d (should be <= %d)", offset, f.size)) - } - return Pos(f.base + offset) -} - -// Offset returns the offset for the given file position p; -// p must be a valid Pos value in that file. -// f.Offset(f.Pos(offset)) == offset. -func (f *File) Offset(p Pos) int { - if int(p) < f.base || int(p) > f.base+f.size { - panic(fmt.Sprintf("invalid Pos value %d (should be in [%d, %d])", p, f.base, f.base+f.size)) - } - return int(p) - f.base -} - -// Line returns the line number for the given file position p; -// p must be a Pos value in that file or NoPos. -func (f *File) Line(p Pos) int { - return f.Position(p).Line -} - -func searchLineInfos(a []lineInfo, x int) int { - return sort.Search(len(a), func(i int) bool { return a[i].Offset > x }) - 1 -} - -// unpack returns the filename and line and column number for a file offset. -// If adjusted is set, unpack will return the filename and line information -// possibly adjusted by //line comments; otherwise those comments are ignored. -func (f *File) unpack(offset int, adjusted bool) (filename string, line, column int) { - f.mutex.Lock() - defer f.mutex.Unlock() - filename = f.name - if i := searchInts(f.lines, offset); i >= 0 { - line, column = i+1, offset-f.lines[i]+1 - } - if adjusted && len(f.infos) > 0 { - // few files have extra line infos - if i := searchLineInfos(f.infos, offset); i >= 0 { - alt := &f.infos[i] - filename = alt.Filename - if i := searchInts(f.lines, alt.Offset); i >= 0 { - // i+1 is the line at which the alternative position was recorded - d := line - (i + 1) // line distance from alternative position base - line = alt.Line + d - if alt.Column == 0 { - // alternative column is unknown => relative column is unknown - // (the current specification for line directives requires - // this to apply until the next PosBase/line directive, - // not just until the new newline) - column = 0 - } else if d == 0 { - // the alternative position base is on the current line - // => column is relative to alternative column - column = alt.Column + (offset - alt.Offset) - } - } - } - } - return -} - -func (f *File) position(p Pos, adjusted bool) (pos Position) { - offset := int(p) - f.base - pos.Offset = offset - pos.Filename, pos.Line, pos.Column = f.unpack(offset, adjusted) - return -} - -// PositionFor returns the Position value for the given file position p. -// If adjusted is set, the position may be adjusted by position-altering -// //line comments; otherwise those comments are ignored. -// p must be a Pos value in f or NoPos. -func (f *File) PositionFor(p Pos, adjusted bool) (pos Position) { - if p != NoPos { - if int(p) < f.base || int(p) > f.base+f.size { - panic(fmt.Sprintf("invalid Pos value %d (should be in [%d, %d])", p, f.base, f.base+f.size)) - } - pos = f.position(p, adjusted) - } - return -} - -// Position returns the Position value for the given file position p. -// Calling f.Position(p) is equivalent to calling f.PositionFor(p, true). -func (f *File) Position(p Pos) (pos Position) { - return f.PositionFor(p, true) -} - -// ----------------------------------------------------------------------------- -// FileSet - -// A FileSet represents a set of source files. -// Methods of file sets are synchronized; multiple goroutines -// may invoke them concurrently. -// -// The byte offsets for each file in a file set are mapped into -// distinct (integer) intervals, one interval [base, base+size] -// per file. Base represents the first byte in the file, and size -// is the corresponding file size. A Pos value is a value in such -// an interval. By determining the interval a Pos value belongs -// to, the file, its file base, and thus the byte offset (position) -// the Pos value is representing can be computed. -// -// When adding a new file, a file base must be provided. That can -// be any integer value that is past the end of any interval of any -// file already in the file set. For convenience, FileSet.Base provides -// such a value, which is simply the end of the Pos interval of the most -// recently added file, plus one. Unless there is a need to extend an -// interval later, using the FileSet.Base should be used as argument -// for FileSet.AddFile. -type FileSet struct { - mutex sync.RWMutex // protects the file set - base int // base offset for the next file - files []*File // list of files in the order added to the set - last *File // cache of last file looked up -} - -// NewFileSet creates a new file set. -func NewFileSet() *FileSet { - return &FileSet{ - base: 1, // 0 == NoPos - } -} - -// Base returns the minimum base offset that must be provided to -// AddFile when adding the next file. -func (s *FileSet) Base() int { - s.mutex.RLock() - b := s.base - s.mutex.RUnlock() - return b - -} - -// AddFile adds a new file with a given filename, base offset, and file size -// to the file set s and returns the file. Multiple files may have the same -// name. The base offset must not be smaller than the FileSet's Base(), and -// size must not be negative. As a special case, if a negative base is provided, -// the current value of the FileSet's Base() is used instead. -// -// Adding the file will set the file set's Base() value to base + size + 1 -// as the minimum base value for the next file. The following relationship -// exists between a Pos value p for a given file offset offs: -// -// int(p) = base + offs -// -// with offs in the range [0, size] and thus p in the range [base, base+size]. -// For convenience, File.Pos may be used to create file-specific position -// values from a file offset. -func (s *FileSet) AddFile(filename string, base, size int) *File { - s.mutex.Lock() - defer s.mutex.Unlock() - if base < 0 { - base = s.base - } - if base < s.base { - panic(fmt.Sprintf("invalid base %d (should be >= %d)", base, s.base)) - } - if size < 0 { - panic(fmt.Sprintf("invalid size %d (should be >= 0)", size)) - } - // base >= s.base && size >= 0 - f := &File{set: s, name: filename, base: base, size: size, lines: []int{0}} - base += size + 1 // +1 because EOF also has a position - if base < 0 { - panic("token.Pos offset overflow (> 2G of source code in file set)") - } - // add the file to the file set - s.base = base - s.files = append(s.files, f) - s.last = f - return f -} - -// Iterate calls f for the files in the file set in the order they were added -// until f returns false. -func (s *FileSet) Iterate(f func(*File) bool) { - for i := 0; ; i++ { - var file *File - s.mutex.RLock() - if i < len(s.files) { - file = s.files[i] - } - s.mutex.RUnlock() - if file == nil || !f(file) { - break - } - } -} - -func searchFiles(a []*File, x int) int { - return sort.Search(len(a), func(i int) bool { return a[i].base > x }) - 1 -} - -func (s *FileSet) file(p Pos) *File { - s.mutex.RLock() - // common case: p is in last file - if f := s.last; f != nil && f.base <= int(p) && int(p) <= f.base+f.size { - s.mutex.RUnlock() - return f - } - // p is not in last file - search all files - if i := searchFiles(s.files, int(p)); i >= 0 { - f := s.files[i] - // f.base <= int(p) by definition of searchFiles - if int(p) <= f.base+f.size { - s.mutex.RUnlock() - s.mutex.Lock() - s.last = f // race is ok - s.last is only a cache - s.mutex.Unlock() - return f - } - } - s.mutex.RUnlock() - return nil -} - -// File returns the file that contains the position p. -// If no such file is found (for instance for p == NoPos), -// the result is nil. -func (s *FileSet) File(p Pos) (f *File) { - if p != NoPos { - f = s.file(p) - } - return -} - -// PositionFor converts a Pos p in the fileset into a Position value. -// If adjusted is set, the position may be adjusted by position-altering -// //line comments; otherwise those comments are ignored. -// p must be a Pos value in s or NoPos. -func (s *FileSet) PositionFor(p Pos, adjusted bool) (pos Position) { - if p != NoPos { - if f := s.file(p); f != nil { - return f.position(p, adjusted) - } - } - return -} - -// Position converts a Pos p in the fileset into a Position value. -// Calling s.Position(p) is equivalent to calling s.PositionFor(p, true). -func (s *FileSet) Position(p Pos) (pos Position) { - return s.PositionFor(p, true) -} - -// ----------------------------------------------------------------------------- -// Helper functions - -func searchInts(a []int, x int) int { - // This function body is a manually inlined version of: - // - // return sort.Search(len(a), func(i int) bool { return a[i] > x }) - 1 - // - // With better compiler optimizations, this may not be needed in the - // future, but at the moment this change improves the go/printer - // benchmark performance by ~30%. This has a direct impact on the - // speed of gofmt and thus seems worthwhile (2011-04-29). - // TODO(gri): Remove this when compilers have caught up. - i, j := 0, len(a) - for i < j { - h := int(uint(i+j) >> 1) // avoid overflow when computing h - // i ≤ h < j - if a[h] <= x { - i = h + 1 - } else { - j = h - } - } - return i - 1 -} diff --git a/internal/backport/go/token/position_bench_test.go b/internal/backport/go/token/position_bench_test.go deleted file mode 100644 index 41be7285b7..0000000000 --- a/internal/backport/go/token/position_bench_test.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package token - -import ( - "testing" -) - -func BenchmarkSearchInts(b *testing.B) { - data := make([]int, 10000) - for i := 0; i < 10000; i++ { - data[i] = i - } - const x = 8 - if r := searchInts(data, x); r != x { - b.Errorf("got index = %d; want %d", r, x) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - searchInts(data, x) - } -} diff --git a/internal/backport/go/token/position_test.go b/internal/backport/go/token/position_test.go deleted file mode 100644 index 7d465dffa6..0000000000 --- a/internal/backport/go/token/position_test.go +++ /dev/null @@ -1,341 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package token - -import ( - "fmt" - "math/rand" - "sync" - "testing" -) - -func checkPos(t *testing.T, msg string, got, want Position) { - if got.Filename != want.Filename { - t.Errorf("%s: got filename = %q; want %q", msg, got.Filename, want.Filename) - } - if got.Offset != want.Offset { - t.Errorf("%s: got offset = %d; want %d", msg, got.Offset, want.Offset) - } - if got.Line != want.Line { - t.Errorf("%s: got line = %d; want %d", msg, got.Line, want.Line) - } - if got.Column != want.Column { - t.Errorf("%s: got column = %d; want %d", msg, got.Column, want.Column) - } -} - -func TestNoPos(t *testing.T) { - if NoPos.IsValid() { - t.Errorf("NoPos should not be valid") - } - var fset *FileSet - checkPos(t, "nil NoPos", fset.Position(NoPos), Position{}) - fset = NewFileSet() - checkPos(t, "fset NoPos", fset.Position(NoPos), Position{}) -} - -var tests = []struct { - filename string - source []byte // may be nil - size int - lines []int -}{ - {"a", []byte{}, 0, []int{}}, - {"b", []byte("01234"), 5, []int{0}}, - {"c", []byte("\n\n\n\n\n\n\n\n\n"), 9, []int{0, 1, 2, 3, 4, 5, 6, 7, 8}}, - {"d", nil, 100, []int{0, 5, 10, 20, 30, 70, 71, 72, 80, 85, 90, 99}}, - {"e", nil, 777, []int{0, 80, 100, 120, 130, 180, 267, 455, 500, 567, 620}}, - {"f", []byte("package p\n\nimport \"fmt\""), 23, []int{0, 10, 11}}, - {"g", []byte("package p\n\nimport \"fmt\"\n"), 24, []int{0, 10, 11}}, - {"h", []byte("package p\n\nimport \"fmt\"\n "), 25, []int{0, 10, 11, 24}}, -} - -func linecol(lines []int, offs int) (int, int) { - prevLineOffs := 0 - for line, lineOffs := range lines { - if offs < lineOffs { - return line, offs - prevLineOffs + 1 - } - prevLineOffs = lineOffs - } - return len(lines), offs - prevLineOffs + 1 -} - -func verifyPositions(t *testing.T, fset *FileSet, f *File, lines []int) { - for offs := 0; offs < f.Size(); offs++ { - p := f.Pos(offs) - offs2 := f.Offset(p) - if offs2 != offs { - t.Errorf("%s, Offset: got offset %d; want %d", f.Name(), offs2, offs) - } - line, col := linecol(lines, offs) - msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p) - checkPos(t, msg, f.Position(f.Pos(offs)), Position{f.Name(), offs, line, col}) - checkPos(t, msg, fset.Position(p), Position{f.Name(), offs, line, col}) - } -} - -func makeTestSource(size int, lines []int) []byte { - src := make([]byte, size) - for _, offs := range lines { - if offs > 0 { - src[offs-1] = '\n' - } - } - return src -} - -func TestPositions(t *testing.T) { - const delta = 7 // a non-zero base offset increment - fset := NewFileSet() - for _, test := range tests { - // verify consistency of test case - if test.source != nil && len(test.source) != test.size { - t.Errorf("%s: inconsistent test case: got file size %d; want %d", test.filename, len(test.source), test.size) - } - - // add file and verify name and size - f := fset.AddFile(test.filename, fset.Base()+delta, test.size) - if f.Name() != test.filename { - t.Errorf("got filename %q; want %q", f.Name(), test.filename) - } - if f.Size() != test.size { - t.Errorf("%s: got file size %d; want %d", f.Name(), f.Size(), test.size) - } - if fset.File(f.Pos(0)) != f { - t.Errorf("%s: f.Pos(0) was not found in f", f.Name()) - } - - // add lines individually and verify all positions - for i, offset := range test.lines { - f.AddLine(offset) - if f.LineCount() != i+1 { - t.Errorf("%s, AddLine: got line count %d; want %d", f.Name(), f.LineCount(), i+1) - } - // adding the same offset again should be ignored - f.AddLine(offset) - if f.LineCount() != i+1 { - t.Errorf("%s, AddLine: got unchanged line count %d; want %d", f.Name(), f.LineCount(), i+1) - } - verifyPositions(t, fset, f, test.lines[0:i+1]) - } - - // add lines with SetLines and verify all positions - if ok := f.SetLines(test.lines); !ok { - t.Errorf("%s: SetLines failed", f.Name()) - } - if f.LineCount() != len(test.lines) { - t.Errorf("%s, SetLines: got line count %d; want %d", f.Name(), f.LineCount(), len(test.lines)) - } - verifyPositions(t, fset, f, test.lines) - - // add lines with SetLinesForContent and verify all positions - src := test.source - if src == nil { - // no test source available - create one from scratch - src = makeTestSource(test.size, test.lines) - } - f.SetLinesForContent(src) - if f.LineCount() != len(test.lines) { - t.Errorf("%s, SetLinesForContent: got line count %d; want %d", f.Name(), f.LineCount(), len(test.lines)) - } - verifyPositions(t, fset, f, test.lines) - } -} - -func TestLineInfo(t *testing.T) { - fset := NewFileSet() - f := fset.AddFile("foo", fset.Base(), 500) - lines := []int{0, 42, 77, 100, 210, 220, 277, 300, 333, 401} - // add lines individually and provide alternative line information - for _, offs := range lines { - f.AddLine(offs) - f.AddLineInfo(offs, "bar", 42) - } - // verify positions for all offsets - for offs := 0; offs <= f.Size(); offs++ { - p := f.Pos(offs) - _, col := linecol(lines, offs) - msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p) - checkPos(t, msg, f.Position(f.Pos(offs)), Position{"bar", offs, 42, col}) - checkPos(t, msg, fset.Position(p), Position{"bar", offs, 42, col}) - } -} - -func TestFiles(t *testing.T) { - fset := NewFileSet() - for i, test := range tests { - base := fset.Base() - if i%2 == 1 { - // Setting a negative base is equivalent to - // fset.Base(), so test some of each. - base = -1 - } - fset.AddFile(test.filename, base, test.size) - j := 0 - fset.Iterate(func(f *File) bool { - if f.Name() != tests[j].filename { - t.Errorf("got filename = %s; want %s", f.Name(), tests[j].filename) - } - j++ - return true - }) - if j != i+1 { - t.Errorf("got %d files; want %d", j, i+1) - } - } -} - -// FileSet.File should return nil if Pos is past the end of the FileSet. -func TestFileSetPastEnd(t *testing.T) { - fset := NewFileSet() - for _, test := range tests { - fset.AddFile(test.filename, fset.Base(), test.size) - } - if f := fset.File(Pos(fset.Base())); f != nil { - t.Errorf("got %v, want nil", f) - } -} - -func TestFileSetCacheUnlikely(t *testing.T) { - fset := NewFileSet() - offsets := make(map[string]int) - for _, test := range tests { - offsets[test.filename] = fset.Base() - fset.AddFile(test.filename, fset.Base(), test.size) - } - for file, pos := range offsets { - f := fset.File(Pos(pos)) - if f.Name() != file { - t.Errorf("got %q at position %d, want %q", f.Name(), pos, file) - } - } -} - -// issue 4345. Test that concurrent use of FileSet.Pos does not trigger a -// race in the FileSet position cache. -func TestFileSetRace(t *testing.T) { - fset := NewFileSet() - for i := 0; i < 100; i++ { - fset.AddFile(fmt.Sprintf("file-%d", i), fset.Base(), 1031) - } - max := int32(fset.Base()) - var stop sync.WaitGroup - r := rand.New(rand.NewSource(7)) - for i := 0; i < 2; i++ { - r := rand.New(rand.NewSource(r.Int63())) - stop.Add(1) - go func() { - for i := 0; i < 1000; i++ { - fset.Position(Pos(r.Int31n(max))) - } - stop.Done() - }() - } - stop.Wait() -} - -// issue 16548. Test that concurrent use of File.AddLine and FileSet.PositionFor -// does not trigger a race in the FileSet position cache. -func TestFileSetRace2(t *testing.T) { - const N = 1e3 - var ( - fset = NewFileSet() - file = fset.AddFile("", -1, N) - ch = make(chan int, 2) - ) - - go func() { - for i := 0; i < N; i++ { - file.AddLine(i) - } - ch <- 1 - }() - - go func() { - pos := file.Pos(0) - for i := 0; i < N; i++ { - fset.PositionFor(pos, false) - } - ch <- 1 - }() - - <-ch - <-ch -} - -func TestPositionFor(t *testing.T) { - src := []byte(` -foo -b -ar -//line :100 -foobar -//line bar:3 -done -`) - - const filename = "foo" - fset := NewFileSet() - f := fset.AddFile(filename, fset.Base(), len(src)) - f.SetLinesForContent(src) - - // verify position info - for i, offs := range f.lines { - got1 := f.PositionFor(f.Pos(offs), false) - got2 := f.PositionFor(f.Pos(offs), true) - got3 := f.Position(f.Pos(offs)) - want := Position{filename, offs, i + 1, 1} - checkPos(t, "1. PositionFor unadjusted", got1, want) - checkPos(t, "1. PositionFor adjusted", got2, want) - checkPos(t, "1. Position", got3, want) - } - - // manually add //line info on lines l1, l2 - const l1, l2 = 5, 7 - f.AddLineInfo(f.lines[l1-1], "", 100) - f.AddLineInfo(f.lines[l2-1], "bar", 3) - - // unadjusted position info must remain unchanged - for i, offs := range f.lines { - got1 := f.PositionFor(f.Pos(offs), false) - want := Position{filename, offs, i + 1, 1} - checkPos(t, "2. PositionFor unadjusted", got1, want) - } - - // adjusted position info should have changed - for i, offs := range f.lines { - got2 := f.PositionFor(f.Pos(offs), true) - got3 := f.Position(f.Pos(offs)) - want := Position{filename, offs, i + 1, 1} - // manually compute wanted filename and line - line := want.Line - if i+1 >= l1 { - want.Filename = "" - want.Line = line - l1 + 100 - } - if i+1 >= l2 { - want.Filename = "bar" - want.Line = line - l2 + 3 - } - checkPos(t, "3. PositionFor adjusted", got2, want) - checkPos(t, "3. Position", got3, want) - } -} - -func TestLineStart(t *testing.T) { - const src = "one\ntwo\nthree\n" - fset := NewFileSet() - f := fset.AddFile("input", -1, len(src)) - f.SetLinesForContent([]byte(src)) - - for line := 1; line <= 3; line++ { - pos := f.LineStart(line) - position := fset.Position(pos) - if position.Line != line || position.Column != 1 { - t.Errorf("LineStart(%d) returned wrong pos %d: %s", line, pos, position) - } - } -} diff --git a/internal/backport/go/token/serialize.go b/internal/backport/go/token/serialize.go deleted file mode 100644 index d0ea34517a..0000000000 --- a/internal/backport/go/token/serialize.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package token - -type serializedFile struct { - // fields correspond 1:1 to fields with same (lower-case) name in File - Name string - Base int - Size int - Lines []int - Infos []lineInfo -} - -type serializedFileSet struct { - Base int - Files []serializedFile -} - -// Read calls decode to deserialize a file set into s; s must not be nil. -func (s *FileSet) Read(decode func(interface{}) error) error { - var ss serializedFileSet - if err := decode(&ss); err != nil { - return err - } - - s.mutex.Lock() - s.base = ss.Base - files := make([]*File, len(ss.Files)) - for i := 0; i < len(ss.Files); i++ { - f := &ss.Files[i] - files[i] = &File{ - set: s, - name: f.Name, - base: f.Base, - size: f.Size, - lines: f.Lines, - infos: f.Infos, - } - } - s.files = files - s.last = nil - s.mutex.Unlock() - - return nil -} - -// Write calls encode to serialize the file set s. -func (s *FileSet) Write(encode func(interface{}) error) error { - var ss serializedFileSet - - s.mutex.Lock() - ss.Base = s.base - files := make([]serializedFile, len(s.files)) - for i, f := range s.files { - f.mutex.Lock() - files[i] = serializedFile{ - Name: f.name, - Base: f.base, - Size: f.size, - Lines: append([]int(nil), f.lines...), - Infos: append([]lineInfo(nil), f.infos...), - } - f.mutex.Unlock() - } - ss.Files = files - s.mutex.Unlock() - - return encode(ss) -} diff --git a/internal/backport/go/token/serialize_test.go b/internal/backport/go/token/serialize_test.go deleted file mode 100644 index 4e925adb6f..0000000000 --- a/internal/backport/go/token/serialize_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package token - -import ( - "bytes" - "encoding/gob" - "fmt" - "testing" -) - -// equal returns nil if p and q describe the same file set; -// otherwise it returns an error describing the discrepancy. -func equal(p, q *FileSet) error { - if p == q { - // avoid deadlock if p == q - return nil - } - - // not strictly needed for the test - p.mutex.Lock() - q.mutex.Lock() - defer q.mutex.Unlock() - defer p.mutex.Unlock() - - if p.base != q.base { - return fmt.Errorf("different bases: %d != %d", p.base, q.base) - } - - if len(p.files) != len(q.files) { - return fmt.Errorf("different number of files: %d != %d", len(p.files), len(q.files)) - } - - for i, f := range p.files { - g := q.files[i] - if f.set != p { - return fmt.Errorf("wrong fileset for %q", f.name) - } - if g.set != q { - return fmt.Errorf("wrong fileset for %q", g.name) - } - if f.name != g.name { - return fmt.Errorf("different filenames: %q != %q", f.name, g.name) - } - if f.base != g.base { - return fmt.Errorf("different base for %q: %d != %d", f.name, f.base, g.base) - } - if f.size != g.size { - return fmt.Errorf("different size for %q: %d != %d", f.name, f.size, g.size) - } - for j, l := range f.lines { - m := g.lines[j] - if l != m { - return fmt.Errorf("different offsets for %q", f.name) - } - } - for j, l := range f.infos { - m := g.infos[j] - if l.Offset != m.Offset || l.Filename != m.Filename || l.Line != m.Line { - return fmt.Errorf("different infos for %q", f.name) - } - } - } - - // we don't care about .last - it's just a cache - return nil -} - -func checkSerialize(t *testing.T, p *FileSet) { - var buf bytes.Buffer - encode := func(x interface{}) error { - return gob.NewEncoder(&buf).Encode(x) - } - if err := p.Write(encode); err != nil { - t.Errorf("writing fileset failed: %s", err) - return - } - q := NewFileSet() - decode := func(x interface{}) error { - return gob.NewDecoder(&buf).Decode(x) - } - if err := q.Read(decode); err != nil { - t.Errorf("reading fileset failed: %s", err) - return - } - if err := equal(p, q); err != nil { - t.Errorf("filesets not identical: %s", err) - } -} - -func TestSerialization(t *testing.T) { - p := NewFileSet() - checkSerialize(t, p) - // add some files - for i := 0; i < 10; i++ { - f := p.AddFile(fmt.Sprintf("file%d", i), p.Base()+i, i*100) - checkSerialize(t, p) - // add some lines and alternative file infos - line := 1000 - for offs := 0; offs < f.Size(); offs += 40 + i { - f.AddLine(offs) - if offs%7 == 0 { - f.AddLineInfo(offs, fmt.Sprintf("file%d", offs), line) - line += 33 - } - } - checkSerialize(t, p) - } -} diff --git a/internal/backport/go/token/token.go b/internal/backport/go/token/token.go deleted file mode 100644 index db4e95577c..0000000000 --- a/internal/backport/go/token/token.go +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package token defines constants representing the lexical tokens of the Go -// programming language and basic operations on tokens (printing, predicates). -package token - -import ( - "strconv" - "unicode" - "unicode/utf8" -) - -// Token is the set of lexical tokens of the Go programming language. -type Token int - -// The list of tokens. -const ( - // Special tokens - ILLEGAL Token = iota - EOF - COMMENT - - literal_beg - // Identifiers and basic type literals - // (these tokens stand for classes of literals) - IDENT // main - INT // 12345 - FLOAT // 123.45 - IMAG // 123.45i - CHAR // 'a' - STRING // "abc" - literal_end - - operator_beg - // Operators and delimiters - ADD // + - SUB // - - MUL // * - QUO // / - REM // % - - AND // & - OR // | - XOR // ^ - SHL // << - SHR // >> - AND_NOT // &^ - - ADD_ASSIGN // += - SUB_ASSIGN // -= - MUL_ASSIGN // *= - QUO_ASSIGN // /= - REM_ASSIGN // %= - - AND_ASSIGN // &= - OR_ASSIGN // |= - XOR_ASSIGN // ^= - SHL_ASSIGN // <<= - SHR_ASSIGN // >>= - AND_NOT_ASSIGN // &^= - - LAND // && - LOR // || - ARROW // <- - INC // ++ - DEC // -- - - EQL // == - LSS // < - GTR // > - ASSIGN // = - NOT // ! - - NEQ // != - LEQ // <= - GEQ // >= - DEFINE // := - ELLIPSIS // ... - - LPAREN // ( - LBRACK // [ - LBRACE // { - COMMA // , - PERIOD // . - - RPAREN // ) - RBRACK // ] - RBRACE // } - SEMICOLON // ; - COLON // : - operator_end - - keyword_beg - // Keywords - BREAK - CASE - CHAN - CONST - CONTINUE - - DEFAULT - DEFER - ELSE - FALLTHROUGH - FOR - - FUNC - GO - GOTO - IF - IMPORT - - INTERFACE - MAP - PACKAGE - RANGE - RETURN - - SELECT - STRUCT - SWITCH - TYPE - VAR - keyword_end - - additional_beg - // additional tokens, handled in an ad-hoc manner - TILDE - additional_end -) - -var tokens = [...]string{ - ILLEGAL: "ILLEGAL", - - EOF: "EOF", - COMMENT: "COMMENT", - - IDENT: "IDENT", - INT: "INT", - FLOAT: "FLOAT", - IMAG: "IMAG", - CHAR: "CHAR", - STRING: "STRING", - - ADD: "+", - SUB: "-", - MUL: "*", - QUO: "/", - REM: "%", - - AND: "&", - OR: "|", - XOR: "^", - SHL: "<<", - SHR: ">>", - AND_NOT: "&^", - - ADD_ASSIGN: "+=", - SUB_ASSIGN: "-=", - MUL_ASSIGN: "*=", - QUO_ASSIGN: "/=", - REM_ASSIGN: "%=", - - AND_ASSIGN: "&=", - OR_ASSIGN: "|=", - XOR_ASSIGN: "^=", - SHL_ASSIGN: "<<=", - SHR_ASSIGN: ">>=", - AND_NOT_ASSIGN: "&^=", - - LAND: "&&", - LOR: "||", - ARROW: "<-", - INC: "++", - DEC: "--", - - EQL: "==", - LSS: "<", - GTR: ">", - ASSIGN: "=", - NOT: "!", - - NEQ: "!=", - LEQ: "<=", - GEQ: ">=", - DEFINE: ":=", - ELLIPSIS: "...", - - LPAREN: "(", - LBRACK: "[", - LBRACE: "{", - COMMA: ",", - PERIOD: ".", - - RPAREN: ")", - RBRACK: "]", - RBRACE: "}", - SEMICOLON: ";", - COLON: ":", - - BREAK: "break", - CASE: "case", - CHAN: "chan", - CONST: "const", - CONTINUE: "continue", - - DEFAULT: "default", - DEFER: "defer", - ELSE: "else", - FALLTHROUGH: "fallthrough", - FOR: "for", - - FUNC: "func", - GO: "go", - GOTO: "goto", - IF: "if", - IMPORT: "import", - - INTERFACE: "interface", - MAP: "map", - PACKAGE: "package", - RANGE: "range", - RETURN: "return", - - SELECT: "select", - STRUCT: "struct", - SWITCH: "switch", - TYPE: "type", - VAR: "var", - - TILDE: "~", -} - -// String returns the string corresponding to the token tok. -// For operators, delimiters, and keywords the string is the actual -// token character sequence (e.g., for the token ADD, the string is -// "+"). For all other tokens the string corresponds to the token -// constant name (e.g. for the token IDENT, the string is "IDENT"). -func (tok Token) String() string { - s := "" - if 0 <= tok && tok < Token(len(tokens)) { - s = tokens[tok] - } - if s == "" { - s = "token(" + strconv.Itoa(int(tok)) + ")" - } - return s -} - -// A set of constants for precedence-based expression parsing. -// Non-operators have lowest precedence, followed by operators -// starting with precedence 1 up to unary operators. The highest -// precedence serves as "catch-all" precedence for selector, -// indexing, and other operator and delimiter tokens. -const ( - LowestPrec = 0 // non-operators - UnaryPrec = 6 - HighestPrec = 7 -) - -// Precedence returns the operator precedence of the binary -// operator op. If op is not a binary operator, the result -// is LowestPrecedence. -func (op Token) Precedence() int { - switch op { - case LOR: - return 1 - case LAND: - return 2 - case EQL, NEQ, LSS, LEQ, GTR, GEQ: - return 3 - case ADD, SUB, OR, XOR: - return 4 - case MUL, QUO, REM, SHL, SHR, AND, AND_NOT: - return 5 - } - return LowestPrec -} - -var keywords map[string]Token - -func init() { - keywords = make(map[string]Token) - for i := keyword_beg + 1; i < keyword_end; i++ { - keywords[tokens[i]] = i - } -} - -// Lookup maps an identifier to its keyword token or IDENT (if not a keyword). -func Lookup(ident string) Token { - if tok, is_keyword := keywords[ident]; is_keyword { - return tok - } - return IDENT -} - -// Predicates - -// IsLiteral returns true for tokens corresponding to identifiers -// and basic type literals; it returns false otherwise. -func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end } - -// IsOperator returns true for tokens corresponding to operators and -// delimiters; it returns false otherwise. -func (tok Token) IsOperator() bool { - return (operator_beg < tok && tok < operator_end) || tok == TILDE -} - -// IsKeyword returns true for tokens corresponding to keywords; -// it returns false otherwise. -func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end } - -// IsExported reports whether name starts with an upper-case letter. -func IsExported(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) -} - -// IsKeyword reports whether name is a Go keyword, such as "func" or "return". -func IsKeyword(name string) bool { - // TODO: opt: use a perfect hash function instead of a global map. - _, ok := keywords[name] - return ok -} - -// IsIdentifier reports whether name is a Go identifier, that is, a non-empty -// string made up of letters, digits, and underscores, where the first character -// is not a digit. Keywords are not identifiers. -func IsIdentifier(name string) bool { - for i, c := range name { - if !unicode.IsLetter(c) && c != '_' && (i == 0 || !unicode.IsDigit(c)) { - return false - } - } - return name != "" && !IsKeyword(name) -} diff --git a/internal/backport/go/token/token_test.go b/internal/backport/go/token/token_test.go deleted file mode 100644 index eff38cc928..0000000000 --- a/internal/backport/go/token/token_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package token - -import "testing" - -func TestIsIdentifier(t *testing.T) { - tests := []struct { - name string - in string - want bool - }{ - {"Empty", "", false}, - {"Space", " ", false}, - {"SpaceSuffix", "foo ", false}, - {"Number", "123", false}, - {"Keyword", "func", false}, - - {"LettersASCII", "foo", true}, - {"MixedASCII", "_bar123", true}, - {"UppercaseKeyword", "Func", true}, - {"LettersUnicode", "fóö", true}, - } - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - if got := IsIdentifier(test.in); got != test.want { - t.Fatalf("IsIdentifier(%q) = %t, want %v", test.in, got, test.want) - } - }) - } -} diff --git a/internal/backport/html/template/attr.go b/internal/backport/html/template/attr.go deleted file mode 100644 index 22922e6038..0000000000 --- a/internal/backport/html/template/attr.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package template - -import ( - "strings" -) - -// attrTypeMap[n] describes the value of the given attribute. -// If an attribute affects (or can mask) the encoding or interpretation of -// other content, or affects the contents, idempotency, or credentials of a -// network message, then the value in this map is contentTypeUnsafe. -// This map is derived from HTML5, specifically -// https://www.w3.org/TR/html5/Overview.html#attributes-1 -// as well as "%URI"-typed attributes from -// https://www.w3.org/TR/html4/index/attributes.html -var attrTypeMap = map[string]contentType{ - "accept": contentTypePlain, - "accept-charset": contentTypeUnsafe, - "action": contentTypeURL, - "alt": contentTypePlain, - "archive": contentTypeURL, - "async": contentTypeUnsafe, - "autocomplete": contentTypePlain, - "autofocus": contentTypePlain, - "autoplay": contentTypePlain, - "background": contentTypeURL, - "border": contentTypePlain, - "checked": contentTypePlain, - "cite": contentTypeURL, - "challenge": contentTypeUnsafe, - "charset": contentTypeUnsafe, - "class": contentTypePlain, - "classid": contentTypeURL, - "codebase": contentTypeURL, - "cols": contentTypePlain, - "colspan": contentTypePlain, - "content": contentTypeUnsafe, - "contenteditable": contentTypePlain, - "contextmenu": contentTypePlain, - "controls": contentTypePlain, - "coords": contentTypePlain, - "crossorigin": contentTypeUnsafe, - "data": contentTypeURL, - "datetime": contentTypePlain, - "default": contentTypePlain, - "defer": contentTypeUnsafe, - "dir": contentTypePlain, - "dirname": contentTypePlain, - "disabled": contentTypePlain, - "draggable": contentTypePlain, - "dropzone": contentTypePlain, - "enctype": contentTypeUnsafe, - "for": contentTypePlain, - "form": contentTypeUnsafe, - "formaction": contentTypeURL, - "formenctype": contentTypeUnsafe, - "formmethod": contentTypeUnsafe, - "formnovalidate": contentTypeUnsafe, - "formtarget": contentTypePlain, - "headers": contentTypePlain, - "height": contentTypePlain, - "hidden": contentTypePlain, - "high": contentTypePlain, - "href": contentTypeURL, - "hreflang": contentTypePlain, - "http-equiv": contentTypeUnsafe, - "icon": contentTypeURL, - "id": contentTypePlain, - "ismap": contentTypePlain, - "keytype": contentTypeUnsafe, - "kind": contentTypePlain, - "label": contentTypePlain, - "lang": contentTypePlain, - "language": contentTypeUnsafe, - "list": contentTypePlain, - "longdesc": contentTypeURL, - "loop": contentTypePlain, - "low": contentTypePlain, - "manifest": contentTypeURL, - "max": contentTypePlain, - "maxlength": contentTypePlain, - "media": contentTypePlain, - "mediagroup": contentTypePlain, - "method": contentTypeUnsafe, - "min": contentTypePlain, - "multiple": contentTypePlain, - "name": contentTypePlain, - "novalidate": contentTypeUnsafe, - // Skip handler names from - // https://www.w3.org/TR/html5/webappapis.html#event-handlers-on-elements,-document-objects,-and-window-objects - // since we have special handling in attrType. - "open": contentTypePlain, - "optimum": contentTypePlain, - "pattern": contentTypeUnsafe, - "placeholder": contentTypePlain, - "poster": contentTypeURL, - "profile": contentTypeURL, - "preload": contentTypePlain, - "pubdate": contentTypePlain, - "radiogroup": contentTypePlain, - "readonly": contentTypePlain, - "rel": contentTypeUnsafe, - "required": contentTypePlain, - "reversed": contentTypePlain, - "rows": contentTypePlain, - "rowspan": contentTypePlain, - "sandbox": contentTypeUnsafe, - "spellcheck": contentTypePlain, - "scope": contentTypePlain, - "scoped": contentTypePlain, - "seamless": contentTypePlain, - "selected": contentTypePlain, - "shape": contentTypePlain, - "size": contentTypePlain, - "sizes": contentTypePlain, - "span": contentTypePlain, - "src": contentTypeURL, - "srcdoc": contentTypeHTML, - "srclang": contentTypePlain, - "srcset": contentTypeSrcset, - "start": contentTypePlain, - "step": contentTypePlain, - "style": contentTypeCSS, - "tabindex": contentTypePlain, - "target": contentTypePlain, - "title": contentTypePlain, - "type": contentTypeUnsafe, - "usemap": contentTypeURL, - "value": contentTypeUnsafe, - "width": contentTypePlain, - "wrap": contentTypePlain, - "xmlns": contentTypeURL, -} - -// attrType returns a conservative (upper-bound on authority) guess at the -// type of the lowercase named attribute. -func attrType(name string) contentType { - if strings.HasPrefix(name, "data-") { - // Strip data- so that custom attribute heuristics below are - // widely applied. - // Treat data-action as URL below. - name = name[5:] - } else if colon := strings.IndexRune(name, ':'); colon != -1 { - if name[:colon] == "xmlns" { - return contentTypeURL - } - // Treat svg:href and xlink:href as href below. - name = name[colon+1:] - } - if t, ok := attrTypeMap[name]; ok { - return t - } - // Treat partial event handler names as script. - if strings.HasPrefix(name, "on") { - return contentTypeJS - } - - // Heuristics to prevent "javascript:..." injection in custom - // data attributes and custom attributes like g:tweetUrl. - // https://www.w3.org/TR/html5/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes - // "Custom data attributes are intended to store custom data - // private to the page or application, for which there are no - // more appropriate attributes or elements." - // Developers seem to store URL content in data URLs that start - // or end with "URI" or "URL". - if strings.Contains(name, "src") || - strings.Contains(name, "uri") || - strings.Contains(name, "url") { - return contentTypeURL - } - return contentTypePlain -} diff --git a/internal/backport/html/template/attr_string.go b/internal/backport/html/template/attr_string.go deleted file mode 100644 index babe70c08b..0000000000 --- a/internal/backport/html/template/attr_string.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by "stringer -type attr"; DO NOT EDIT. - -package template - -import "strconv" - -const _attr_name = "attrNoneattrScriptattrScriptTypeattrStyleattrURLattrSrcset" - -var _attr_index = [...]uint8{0, 8, 18, 32, 41, 48, 58} - -func (i attr) String() string { - if i >= attr(len(_attr_index)-1) { - return "attr(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _attr_name[_attr_index[i]:_attr_index[i+1]] -} diff --git a/internal/backport/html/template/clone_test.go b/internal/backport/html/template/clone_test.go deleted file mode 100644 index 07e8ef39a1..0000000000 --- a/internal/backport/html/template/clone_test.go +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package template - -import ( - "bytes" - "errors" - "fmt" - "io/ioutil" - "strings" - "sync" - "testing" - - "golang.org/x/website/internal/backport/text/template/parse" -) - -func TestAddParseTreeHTML(t *testing.T) { - root := Must(New("root").Parse(`{{define "a"}} {{.}} {{template "b"}} {{.}} ">{{end}}`)) - tree, err := parse.Parse("t", `{{define "b"}}0") - if err != nil { - t.Fatal(err) - } - if got, want := b.String(), ` 1>0 `; got != want { - t.Errorf("got %q want %q", got, want) - } -} - -func TestClone(t *testing.T) { - // The {{.}} will be executed with data "*/" in different contexts. - // In the t0 template, it will be in a text context. - // In the t1 template, it will be in a URL context. - // In the t2 template, it will be in a JavaScript context. - // In the t3 template, it will be in a CSS context. - const tmpl = `{{define "a"}}{{template "lhs"}}{{.}}{{template "rhs"}}{{end}}` - b := new(bytes.Buffer) - - // Create an incomplete template t0. - t0 := Must(New("t0").Parse(tmpl)) - - // Clone t0 as t1. - t1 := Must(t0.Clone()) - Must(t1.Parse(`{{define "lhs"}} {{end}}`)) - - // Execute t1. - b.Reset() - if err := t1.ExecuteTemplate(b, "a", "*/"); err != nil { - t.Fatal(err) - } - if got, want := b.String(), ` `; got != want { - t.Errorf("t1: got %q want %q", got, want) - } - - // Clone t0 as t2. - t2 := Must(t0.Clone()) - Must(t2.Parse(`{{define "lhs"}}

{{end}}`)) - - // Execute t2. - b.Reset() - if err := t2.ExecuteTemplate(b, "a", "*/"); err != nil { - t.Fatal(err) - } - if got, want := b.String(), `

`; got != want { - t.Errorf("t2: got %q want %q", got, want) - } - - // Clone t0 as t3, but do not execute t3 yet. - t3 := Must(t0.Clone()) - Must(t3.Parse(`{{define "lhs"}} {{end}}`)) - - // Complete t0. - Must(t0.Parse(`{{define "lhs"}} ( {{end}}`)) - Must(t0.Parse(`{{define "rhs"}} ) {{end}}`)) - - // Clone t0 as t4. Redefining the "lhs" template should not fail. - t4 := Must(t0.Clone()) - if _, err := t4.Parse(`{{define "lhs"}} OK {{end}}`); err != nil { - t.Errorf(`redefine "lhs": got err %v want nil`, err) - } - // Cloning t1 should fail as it has been executed. - if _, err := t1.Clone(); err == nil { - t.Error("cloning t1: got nil err want non-nil") - } - // Redefining the "lhs" template in t1 should fail as it has been executed. - if _, err := t1.Parse(`{{define "lhs"}} OK {{end}}`); err == nil { - t.Error(`redefine "lhs": got nil err want non-nil`) - } - - // Execute t0. - b.Reset() - if err := t0.ExecuteTemplate(b, "a", "*/"); err != nil { - t.Fatal(err) - } - if got, want := b.String(), ` ( <i>*/ ) `; got != want { - t.Errorf("t0: got %q want %q", got, want) - } - - // Clone t0. This should fail, as t0 has already executed. - if _, err := t0.Clone(); err == nil { - t.Error(`t0.Clone(): got nil err want non-nil`) - } - - // Similarly, cloning sub-templates should fail. - if _, err := t0.Lookup("a").Clone(); err == nil { - t.Error(`t0.Lookup("a").Clone(): got nil err want non-nil`) - } - if _, err := t0.Lookup("lhs").Clone(); err == nil { - t.Error(`t0.Lookup("lhs").Clone(): got nil err want non-nil`) - } - - // Execute t3. - b.Reset() - if err := t3.ExecuteTemplate(b, "a", "*/"); err != nil { - t.Fatal(err) - } - if got, want := b.String(), ` `; got != want { - t.Errorf("t3: got %q want %q", got, want) - } -} - -func TestTemplates(t *testing.T) { - names := []string{"t0", "a", "lhs", "rhs"} - // Some template definitions borrowed from TestClone. - const tmpl = ` - {{define "a"}}{{template "lhs"}}{{.}}{{template "rhs"}}{{end}} - {{define "lhs"}} {{end}}` - t0 := Must(New("t0").Parse(tmpl)) - templates := t0.Templates() - if len(templates) != len(names) { - t.Errorf("expected %d templates; got %d", len(names), len(templates)) - } - for _, name := range names { - found := false - for _, tmpl := range templates { - if name == tmpl.text.Name() { - found = true - break - } - } - if !found { - t.Error("could not find template", name) - } - } -} - -// This used to crash; https://golang.org/issue/3281 -func TestCloneCrash(t *testing.T) { - t1 := New("all") - Must(t1.New("t1").Parse(`{{define "foo"}}foo{{end}}`)) - t1.Clone() -} - -// Ensure that this guarantee from the docs is upheld: -// "Further calls to Parse in the copy will add templates -// to the copy but not to the original." -func TestCloneThenParse(t *testing.T) { - t0 := Must(New("t0").Parse(`{{define "a"}}{{template "embedded"}}{{end}}`)) - t1 := Must(t0.Clone()) - Must(t1.Parse(`{{define "embedded"}}t1{{end}}`)) - if len(t0.Templates())+1 != len(t1.Templates()) { - t.Error("adding a template to a clone added it to the original") - } - // double check that the embedded template isn't available in the original - err := t0.ExecuteTemplate(ioutil.Discard, "a", nil) - if err == nil { - t.Error("expected 'no such template' error") - } -} - -// https://golang.org/issue/5980 -func TestFuncMapWorksAfterClone(t *testing.T) { - funcs := FuncMap{"customFunc": func() (string, error) { - return "", errors.New("issue5980") - }} - - // get the expected error output (no clone) - uncloned := Must(New("").Funcs(funcs).Parse("{{customFunc}}")) - wantErr := uncloned.Execute(ioutil.Discard, nil) - - // toClone must be the same as uncloned. It has to be recreated from scratch, - // since cloning cannot occur after execution. - toClone := Must(New("").Funcs(funcs).Parse("{{customFunc}}")) - cloned := Must(toClone.Clone()) - gotErr := cloned.Execute(ioutil.Discard, nil) - - if wantErr.Error() != gotErr.Error() { - t.Errorf("clone error message mismatch want %q got %q", wantErr, gotErr) - } -} - -// https://golang.org/issue/16101 -func TestTemplateCloneExecuteRace(t *testing.T) { - const ( - input = `{{block "a" .}}a{{end}}{{block "b" .}}b{{end}}` - overlay = `{{define "b"}}A{{end}}` - ) - outer := Must(New("outer").Parse(input)) - tmpl := Must(Must(outer.Clone()).Parse(overlay)) - - var wg sync.WaitGroup - for i := 0; i < 10; i++ { - wg.Add(1) - go func() { - defer wg.Done() - for i := 0; i < 100; i++ { - if err := tmpl.Execute(ioutil.Discard, "data"); err != nil { - panic(err) - } - } - }() - } - wg.Wait() -} - -func TestTemplateCloneLookup(t *testing.T) { - // Template.escape makes an assumption that the template associated - // with t.Name() is t. Check that this holds. - tmpl := Must(New("x").Parse("a")) - tmpl = Must(tmpl.Clone()) - if tmpl.Lookup(tmpl.Name()) != tmpl { - t.Error("after Clone, tmpl.Lookup(tmpl.Name()) != tmpl") - } -} - -func TestCloneGrowth(t *testing.T) { - tmpl := Must(New("root").Parse(`{{block "B". }}Arg{{end}}`)) - tmpl = Must(tmpl.Clone()) - Must(tmpl.Parse(`{{define "B"}}Text{{end}}`)) - for i := 0; i < 10; i++ { - tmpl.Execute(ioutil.Discard, nil) - } - if len(tmpl.DefinedTemplates()) > 200 { - t.Fatalf("too many templates: %v", len(tmpl.DefinedTemplates())) - } -} - -// https://golang.org/issue/17735 -func TestCloneRedefinedName(t *testing.T) { - const base = ` -{{ define "a" -}}{{ template "b" . -}}{{ end -}} -{{ define "b" }}{{ end -}} -` - const page = `{{ template "a" . }}` - - t1 := Must(New("a").Parse(base)) - - for i := 0; i < 2; i++ { - t2 := Must(t1.Clone()) - t2 = Must(t2.New(fmt.Sprintf("%d", i)).Parse(page)) - err := t2.Execute(ioutil.Discard, nil) - if err != nil { - t.Fatal(err) - } - } -} - -// Issue 24791. -func TestClonePipe(t *testing.T) { - a := Must(New("a").Parse(`{{define "a"}}{{range $v := .A}}{{$v}}{{end}}{{end}}`)) - data := struct{ A []string }{A: []string{"hi"}} - b := Must(a.Clone()) - var buf strings.Builder - if err := b.Execute(&buf, &data); err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "hi"; got != want { - t.Errorf("got %q want %q", got, want) - } -} diff --git a/internal/backport/html/template/content.go b/internal/backport/html/template/content.go deleted file mode 100644 index 9cf3153a88..0000000000 --- a/internal/backport/html/template/content.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package template - -import ( - "fmt" - "reflect" - - stdtemplate "html/template" -) - -// Strings of content from a trusted source. -type ( - // CSS encapsulates known safe content that matches any of: - // 1. The CSS3 stylesheet production, such as `p { color: purple }`. - // 2. The CSS3 rule production, such as `a[href=~"https:"].foo#bar`. - // 3. CSS3 declaration productions, such as `color: red; margin: 2px`. - // 4. The CSS3 value production, such as `rgba(0, 0, 255, 127)`. - // See https://www.w3.org/TR/css3-syntax/#parsing and - // https://web.archive.org/web/20090211114933/http://w3.org/TR/css3-syntax#style - // - // Use of this type presents a security risk: - // the encapsulated content should come from a trusted source, - // as it will be included verbatim in the template output. - CSS = stdtemplate.CSS - - // HTML encapsulates a known safe HTML document fragment. - // It should not be used for HTML from a third-party, or HTML with - // unclosed tags or comments. The outputs of a sound HTML sanitizer - // and a template escaped by this package are fine for use with HTML. - // - // Use of this type presents a security risk: - // the encapsulated content should come from a trusted source, - // as it will be included verbatim in the template output. - HTML = stdtemplate.HTML - - // HTMLAttr encapsulates an HTML attribute from a trusted source, - // for example, ` dir="ltr"`. - // - // Use of this type presents a security risk: - // the encapsulated content should come from a trusted source, - // as it will be included verbatim in the template output. - HTMLAttr = stdtemplate.HTMLAttr - - // JS encapsulates a known safe EcmaScript5 Expression, for example, - // `(x + y * z())`. - // Template authors are responsible for ensuring that typed expressions - // do not break the intended precedence and that there is no - // statement/expression ambiguity as when passing an expression like - // "{ foo: bar() }\n['foo']()", which is both a valid Expression and a - // valid Program with a very different meaning. - // - // Use of this type presents a security risk: - // the encapsulated content should come from a trusted source, - // as it will be included verbatim in the template output. - // - // Using JS to include valid but untrusted JSON is not safe. - // A safe alternative is to parse the JSON with json.Unmarshal and then - // pass the resultant object into the template, where it will be - // converted to sanitized JSON when presented in a JavaScript context. - JS = stdtemplate.JS - - // JSStr encapsulates a sequence of characters meant to be embedded - // between quotes in a JavaScript expression. - // The string must match a series of StringCharacters: - // StringCharacter :: SourceCharacter but not `\` or LineTerminator - // | EscapeSequence - // Note that LineContinuations are not allowed. - // JSStr("foo\\nbar") is fine, but JSStr("foo\\\nbar") is not. - // - // Use of this type presents a security risk: - // the encapsulated content should come from a trusted source, - // as it will be included verbatim in the template output. - JSStr = stdtemplate.JSStr - - // URL encapsulates a known safe URL or URL substring (see RFC 3986). - // A URL like `javascript:checkThatFormNotEditedBeforeLeavingPage()` - // from a trusted source should go in the page, but by default dynamic - // `javascript:` URLs are filtered out since they are a frequently - // exploited injection vector. - // - // Use of this type presents a security risk: - // the encapsulated content should come from a trusted source, - // as it will be included verbatim in the template output. - URL = stdtemplate.URL - - // Srcset encapsulates a known safe srcset attribute - // (see https://w3c.github.io/html/semantics-embedded-content.html#element-attrdef-img-srcset). - // - // Use of this type presents a security risk: - // the encapsulated content should come from a trusted source, - // as it will be included verbatim in the template output. - Srcset = stdtemplate.Srcset -) - -type contentType uint8 - -const ( - contentTypePlain contentType = iota - contentTypeCSS - contentTypeHTML - contentTypeHTMLAttr - contentTypeJS - contentTypeJSStr - contentTypeURL - contentTypeSrcset - // contentTypeUnsafe is used in attr.go for values that affect how - // embedded content and network messages are formed, vetted, - // or interpreted; or which credentials network messages carry. - contentTypeUnsafe -) - -// indirect returns the value, after dereferencing as many times -// as necessary to reach the base type (or nil). -func indirect(a interface{}) interface{} { - if a == nil { - return nil - } - if t := reflect.TypeOf(a); t.Kind() != reflect.Ptr { - // Avoid creating a reflect.Value if it's not a pointer. - return a - } - v := reflect.ValueOf(a) - for v.Kind() == reflect.Ptr && !v.IsNil() { - v = v.Elem() - } - return v.Interface() -} - -var ( - errorType = reflect.TypeOf((*error)(nil)).Elem() - fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() -) - -// indirectToStringerOrError returns the value, after dereferencing as many times -// as necessary to reach the base type (or nil) or an implementation of fmt.Stringer -// or error, -func indirectToStringerOrError(a interface{}) interface{} { - if a == nil { - return nil - } - v := reflect.ValueOf(a) - for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Ptr && !v.IsNil() { - v = v.Elem() - } - return v.Interface() -} - -// stringify converts its arguments to a string and the type of the content. -// All pointers are dereferenced, as in the text/template package. -func stringify(args ...interface{}) (string, contentType) { - if len(args) == 1 { - switch s := indirect(args[0]).(type) { - case string: - return s, contentTypePlain - case CSS: - return string(s), contentTypeCSS - case HTML: - return string(s), contentTypeHTML - case HTMLAttr: - return string(s), contentTypeHTMLAttr - case JS: - return string(s), contentTypeJS - case JSStr: - return string(s), contentTypeJSStr - case URL: - return string(s), contentTypeURL - case Srcset: - return string(s), contentTypeSrcset - } - } - i := 0 - for _, arg := range args { - // We skip untyped nil arguments for backward compatibility. - // Without this they would be output as , escaped. - // See issue 25875. - if arg == nil { - continue - } - - args[i] = indirectToStringerOrError(arg) - i++ - } - return fmt.Sprint(args[:i]...), contentTypePlain -} diff --git a/internal/backport/html/template/content_test.go b/internal/backport/html/template/content_test.go deleted file mode 100644 index e6f47a27b9..0000000000 --- a/internal/backport/html/template/content_test.go +++ /dev/null @@ -1,458 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package template - -import ( - "bytes" - "fmt" - "strings" - "testing" -) - -func TestTypedContent(t *testing.T) { - data := []interface{}{ - ` "foo%" O'Reilly &bar;`, - CSS(`a[href =~ "//example.com"]#foo`), - HTML(`Hello, World &tc!`), - HTMLAttr(` dir="ltr"`), - JS(`c && alert("Hello, World!");`), - JSStr(`Hello, World & O'Reilly\u0021`), - URL(`greeting=H%69,&addressee=(World)`), - Srcset(`greeting=H%69,&addressee=(World) 2x, https://golang.org/favicon.ico 500.5w`), - URL(`,foo/,`), - } - - // For each content sensitive escaper, see how it does on - // each of the typed strings above. - tests := []struct { - // A template containing a single {{.}}. - input string - want []string - }{ - { - ``, - []string{ - `ZgotmplZ`, - // Allowed but not escaped. - `a[href =~ "//example.com"]#foo`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - }, - }, - { - `
`, - []string{ - `ZgotmplZ`, - // Allowed and HTML escaped. - `a[href =~ "//example.com"]#foo`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - }, - }, - { - `{{.}}`, - []string{ - `<b> "foo%" O'Reilly &bar;`, - `a[href =~ "//example.com"]#foo`, - // Not escaped. - `Hello, World &tc!`, - ` dir="ltr"`, - `c && alert("Hello, World!");`, - `Hello, World & O'Reilly\u0021`, - `greeting=H%69,&addressee=(World)`, - `greeting=H%69,&addressee=(World) 2x, https://golang.org/favicon.ico 500.5w`, - `,foo/,`, - }, - }, - { - ``, - []string{ - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - // Allowed and HTML escaped. - ` dir="ltr"`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - `ZgotmplZ`, - }, - }, - { - ``, - []string{ - `<b> "foo%" O'Reilly &bar;`, - `a[href =~ "//example.com"]#foo`, - // Tags stripped, spaces escaped, entity not re-escaped. - `Hello, World &tc!`, - ` dir="ltr"`, - `c && alert("Hello, World!");`, - `Hello, World & O'Reilly\u0021`, - `greeting=H%69,&addressee=(World)`, - `greeting=H%69,&addressee=(World) 2x, https://golang.org/favicon.ico 500.5w`, - `,foo/,`, - }, - }, - { - ``, - []string{ - `<b> "foo%" O'Reilly &bar;`, - `a[href =~ "//example.com"]#foo`, - // Tags stripped, entity not re-escaped. - `Hello, World &tc!`, - ` dir="ltr"`, - `c && alert("Hello, World!");`, - `Hello, World & O'Reilly\u0021`, - `greeting=H%69,&addressee=(World)`, - `greeting=H%69,&addressee=(World) 2x, https://golang.org/favicon.ico 500.5w`, - `,foo/,`, - }, - }, - { - ``, - []string{ - `<b> "foo%" O'Reilly &bar;`, - `a[href =~ "//example.com"]#foo`, - // Angle brackets escaped to prevent injection of close tags, entity not re-escaped. - `Hello, <b>World</b> &tc!`, - ` dir="ltr"`, - `c && alert("Hello, World!");`, - `Hello, World & O'Reilly\u0021`, - `greeting=H%69,&addressee=(World)`, - `greeting=H%69,&addressee=(World) 2x, https://golang.org/favicon.ico 500.5w`, - `,foo/,`, - }, - }, - { - ``, - []string{ - `"\u003cb\u003e \"foo%\" O'Reilly \u0026bar;"`, - `"a[href =~ \"//example.com\"]#foo"`, - `"Hello, \u003cb\u003eWorld\u003c/b\u003e \u0026amp;tc!"`, - `" dir=\"ltr\""`, - // Not escaped. - `c && alert("Hello, World!");`, - // Escape sequence not over-escaped. - `"Hello, World & O'Reilly\u0021"`, - `"greeting=H%69,\u0026addressee=(World)"`, - `"greeting=H%69,\u0026addressee=(World) 2x, https://golang.org/favicon.ico 500.5w"`, - `",foo/,"`, - }, - }, - { - `