| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.junit.linker; |
| |
| import com.google.gwt.core.ext.LinkerContext; |
| import com.google.gwt.core.ext.TreeLogger; |
| import com.google.gwt.core.ext.TreeLogger.Type; |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.core.ext.linker.AbstractLinker; |
| import com.google.gwt.core.ext.linker.ArtifactSet; |
| import com.google.gwt.core.ext.linker.CompilationResult; |
| import com.google.gwt.core.ext.linker.DelegatingCompilationResult; |
| import com.google.gwt.core.ext.linker.LinkerOrder; |
| import com.google.gwt.core.ext.linker.Shardable; |
| import com.google.gwt.core.ext.linker.StatementRanges; |
| import com.google.gwt.core.ext.linker.impl.StatementRangesBuilder; |
| import com.google.gwt.core.linker.SymbolMapsLinker; |
| import com.google.gwt.util.tools.Utility; |
| |
| import java.io.IOException; |
| |
| /** |
| * A linker which prepends the code to bootstrap closurehelpers.js into the primary fragment. |
| */ |
| @Shardable |
| @LinkerOrder(LinkerOrder.Order.PRE) |
| public class ClosureHelpersLinker extends AbstractLinker { |
| |
| @Override |
| public String getDescription() { |
| return "ClosureHelpersLinker"; |
| } |
| |
| @Override |
| public ArtifactSet link(final TreeLogger logger, LinkerContext context, ArtifactSet artifacts, |
| boolean onePermutation) throws UnableToCompleteException { |
| if (!onePermutation) { |
| // only do work on final link |
| return artifacts; |
| } |
| |
| ArtifactSet updatedArtifacts = new ArtifactSet(artifacts); |
| for (final CompilationResult compilationResult : artifacts.find(CompilationResult.class)) { |
| final String closureHelpers = getClosureHelpers(logger); |
| DelegatingCompilationResult updatedResult = new DelegatingCompilationResult( |
| ClosureHelpersLinker.class, compilationResult) { |
| String rewrittenJs[] = null; |
| StatementRanges ranges[] = null; |
| |
| @Override |
| public String[] getJavaScript() { |
| if (rewrittenJs == null) { |
| rewrittenJs = compilationResult.getJavaScript().clone(); |
| rewrittenJs[0] = closureHelpers + rewrittenJs[0]; |
| } |
| return rewrittenJs; |
| } |
| |
| @Override |
| public StatementRanges[] getStatementRanges() { |
| if (ranges == null) { |
| ranges = compilationResult.getStatementRanges().clone(); |
| StatementRanges oldStmtRange = ranges[0]; |
| StatementRangesBuilder builder = new StatementRangesBuilder(); |
| builder.addStartPosition(0); |
| builder.addEndPosition(closureHelpers.length()); |
| builder.append(oldStmtRange); |
| ranges[0] = builder.build(); |
| } |
| return ranges; |
| } |
| }; |
| updatedArtifacts.remove(compilationResult); |
| updatedArtifacts.add(updatedResult); |
| SymbolMapsLinker.ScriptFragmentEditsArtifact editArtifact = |
| new SymbolMapsLinker.ScriptFragmentEditsArtifact(null, 0); |
| editArtifact.prefixLines(closureHelpers); |
| updatedArtifacts.add(editArtifact); |
| break; |
| } |
| return updatedArtifacts; |
| } |
| |
| private String getClosureHelpers(TreeLogger logger) throws UnableToCompleteException { |
| try { |
| return Utility.getFileFromClassPath("com/google/gwt/junit/linker/closurehelpers.js"); |
| } catch (IOException e) { |
| logger.log(Type.ERROR, "Can't load closurehelpers.js", e); |
| throw new UnableToCompleteException(); |
| } |
| } |
| } |