blob: b299c9ca148bf667117c191b3e1df576a32b7e80 [file] [log] [blame]
/*
* 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();
}
}
}