(pkgs []*Archive, w *sourcemapx.Filter, goVersion, testBinary string)
| 129 | } |
| 130 | |
| 131 | func WriteProgramCode(pkgs []*Archive, w *sourcemapx.Filter, goVersion, testBinary string) error { |
| 132 | mainPkg := pkgs[len(pkgs)-1] |
| 133 | minify := mainPkg.Minified |
| 134 | |
| 135 | // Aggregate all go:linkname directives in the program together. |
| 136 | gls := linkname.GoLinknameSet{} |
| 137 | for _, pkg := range pkgs { |
| 138 | gls.Add(pkg.GoLinknames) |
| 139 | } |
| 140 | |
| 141 | sel := &dce.Selector[*Decl]{} |
| 142 | for _, pkg := range pkgs { |
| 143 | for _, d := range pkg.Declarations { |
| 144 | implementsLink := false |
| 145 | if gls.IsImplementation(d.LinkingName) { |
| 146 | // If a decl is referenced by a go:linkname directive, we just assume |
| 147 | // it's not dead. |
| 148 | // TODO(nevkontakte): This is a safe, but imprecise assumption. We should |
| 149 | // try and trace whether the referencing functions are actually live. |
| 150 | implementsLink = true |
| 151 | } |
| 152 | sel.Include(d, implementsLink) |
| 153 | } |
| 154 | } |
| 155 | dceSelection := sel.AliveDecls() |
| 156 | |
| 157 | if _, err := writeF(w, false, "\"use strict\";\n(function() {\n\n"); err != nil { |
| 158 | return err |
| 159 | } |
| 160 | if _, err := writeF(w, false, "var $goVersion = %q;\n", goVersion); err != nil { |
| 161 | return err |
| 162 | } |
| 163 | if _, err := writeF(w, false, "var $testBinary = %q;\n", testBinary); err != nil { |
| 164 | return err |
| 165 | } |
| 166 | for _, preludeFile := range prelude.PreludeFiles() { |
| 167 | if _, err := w.WriteJS(preludeFile.Source, preludeFile.Name, minify); err != nil { |
| 168 | return err |
| 169 | } |
| 170 | } |
| 171 | if _, err := writeF(w, false, "\n"); err != nil { |
| 172 | return err |
| 173 | } |
| 174 | |
| 175 | // write packages |
| 176 | for _, pkg := range pkgs { |
| 177 | if err := WritePkgCode(pkg, dceSelection, gls, minify, w); err != nil { |
| 178 | return err |
| 179 | } |
| 180 | } |
| 181 | |
| 182 | if _, err := writeF(w, false, "$callForAllPackages(\"$finishSetup\");\n"); err != nil { |
| 183 | return err |
| 184 | } |
| 185 | if _, err := writeF(w, false, "$synthesizeMethods();\n"); err != nil { |
| 186 | return err |
| 187 | } |
| 188 | if _, err := writeF(w, false, "$callForAllPackages(\"$initLinknames\");\n"); err != nil { |
no test coverage detected
searching dependent graphs…