diff --git a/dev/build.xml b/dev/build.xml
index 1b5a2ac9ffc..0b181dd75a9 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -68,11 +68,12 @@
-
+
+
-
+
@@ -129,7 +130,8 @@
src="${gwt.tools.lib}/eclipse/org.eclipse.jdt.core_3.32.0.v20221108-1853.jar"/>
-
+
+
@@ -140,7 +142,7 @@
-
+
@@ -227,9 +229,11 @@
+ location="${gwt.tools.lib}/guava/guava-33.0/guava-33.0.0-jre-rebased.jar"/>
+
-
+
selectionProperties;
+ private final ModuleDef module;
public StandardLinkerContext(TreeLogger logger, ModuleDef module,
ResourceOracle publicResourceOracle, JsOutputOption outputOption)
@@ -143,6 +144,7 @@ public StandardLinkerContext(TreeLogger logger, ModuleDef module,
this.moduleLastModified = module.lastModified();
this.publicResourceOracle = publicResourceOracle;
this.outputOption = outputOption;
+ this.module = module;
// Sort the linkers into the order they should actually run.
linkerClasses = new ArrayList>();
@@ -537,6 +539,10 @@ public void produceOutput(TreeLogger logger, ArtifactSet artifacts,
}
}
+ public ModuleDef getModule() {
+ return module;
+ }
+
/**
* (Re)instantiate all linkers.
*/
diff --git a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
index edffd14cc7f..b56a65d7f4a 100644
--- a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
@@ -15,6 +15,9 @@
*/
package com.google.gwt.core.linker;
+import static java.util.Objects.isNull;
+import static java.util.Objects.nonNull;
+
import com.google.gwt.core.ext.LinkerContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
@@ -31,17 +34,27 @@
import com.google.gwt.core.ext.linker.SoftPermutation;
import com.google.gwt.core.ext.linker.SymbolData;
import com.google.gwt.core.ext.linker.SyntheticArtifact;
+import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
+import com.google.gwt.dev.cfg.ResourceLoader;
+import com.google.gwt.dev.cfg.ResourceLoaders;
import com.google.gwt.dev.util.Util;
import com.google.gwt.dev.util.collect.HashMap;
import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
+import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapConsumerV3;
import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapGeneratorV3;
-import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapGeneratorV3.ExtensionMergeAction;
+import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapParseException;
+import com.google.gwt.thirdparty.guava.common.collect.Maps;
+import com.google.gwt.util.tools.Utility;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.net.URISyntaxException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -162,7 +175,8 @@ public static class SourceMapArtifact extends SyntheticArtifact {
private final String sourceRoot;
public SourceMapArtifact(int permutationId, int fragment, byte[] js, String sourceRoot) {
- super(SymbolMapsLinker.class, permutationId + '/' + sourceMapFilenameForFragment(fragment), js);
+ super(SymbolMapsLinker.class, permutationId + '/' +
+ sourceMapFilenameForFragment(fragment), js);
this.permutationId = permutationId;
this.fragment = fragment;
this.js = js;
@@ -277,6 +291,7 @@ public ArtifactSet link(TreeLogger logger, LinkerContext context,
Event writeSourceMapsEvent =
SpeedTracerLogger.start(CompilerEventType.WRITE_SOURCE_MAPS);
+ StandardLinkerContext stdContext = (StandardLinkerContext) context;
for (SourceMapArtifact se : artifacts.find(SourceMapArtifact.class)) {
// filename is permutation_id/sourceMap.json
String sourceMapString = Util.readStreamAsString(se.getContents(logger));
@@ -312,14 +327,16 @@ public ArtifactSet link(TreeLogger logger, LinkerContext context,
totalPrefixLines += op.getNumLines();
}
}
+
// TODO(cromwellian): apply insert and remove edits
- sourceMapGenerator.mergeMapSection(totalPrefixLines, 0, sourceMapString,
- new ExtensionMergeAction() {
- @Override
- public Object merge(String extKey, Object oldVal, Object newVal) {
- return newVal;
- }
- });
+ if (stdContext.getModule().shouldEmbedSourceMapContents()) {
+ embedSourcesInSourceMaps(logger, stdContext, artifacts, sourceMapGenerator,
+ totalPrefixLines, sourceMapString, partialPath);
+ } else {
+ sourceMapGenerator.mergeMapSection(totalPrefixLines, 0, sourceMapString,
+ (extKey, oldVal, newVal) -> newVal);
+ }
+
StringWriter stringWriter = new StringWriter();
sourceMapGenerator.appendTo(stringWriter, "sourceMap");
emArt = emitSourceMapString(logger, stringWriter.toString(), partialPath);
@@ -335,6 +352,68 @@ public Object merge(String extKey, Object oldVal, Object newVal) {
return artifacts;
}
+ private static void embedSourcesInSourceMaps(TreeLogger logger, StandardLinkerContext context,
+ ArtifactSet artifacts,
+ SourceMapGeneratorV3 sourceMapGenerator,
+ int totalPrefixLines, String sourceMapString,
+ String partialPath)
+ throws SourceMapParseException {
+ sourceMapGenerator.setStartingPosition(totalPrefixLines, 0);
+ SourceMapConsumerV3 section = new SourceMapConsumerV3();
+ section.parse(sourceMapString);
+ section.visitMappings(sourceMapGenerator::addMapping);
+
+ for (Entry entry : section.getExtensions().entrySet()) {
+ String extensionKey = entry.getKey();
+ sourceMapGenerator.addExtension(extensionKey, entry.getValue());
+ }
+
+ ResourceLoader resourceLoader = ResourceLoaders.fromContextClassLoader();
+
+ Map generatedSources = Maps.newHashMap();
+ artifacts.find(EmittedArtifact.class)
+ .forEach(emittedArtifact -> {
+ if (Visibility.Source == emittedArtifact.getVisibility()) {
+ generatedSources.put(emittedArtifact.getPartialPath(), emittedArtifact);
+ }
+ });
+
+ for (String sourceFileName : section.getOriginalSources()) {
+ String content;
+ InputStream cis = null;
+ try {
+ cis = loadSource(logger, sourceFileName, generatedSources,
+ resourceLoader);
+ if (isNull(cis)) {
+ cis = context.getModule().findSourceFile(sourceFileName).openContents();
+ }
+ content = Util.readStreamAsString(cis);
+ sourceMapGenerator.addSourcesContent(sourceFileName, content);
+ } catch (UnableToCompleteException | URISyntaxException | IOException e) {
+ logger.log(TreeLogger.Type.WARN, "Can't write source map " +
+ partialPath, e);
+ } finally {
+ Utility.close(cis);
+ }
+ }
+ }
+
+ private static InputStream loadSource(TreeLogger logger, String sourceFileName,
+ Map generatedSources,
+ ResourceLoader resourceLoader)
+ throws UnableToCompleteException, URISyntaxException, IOException {
+ if (generatedSources.containsKey(sourceFileName)) {
+ return generatedSources.get(sourceFileName).getContents(logger);
+ } else {
+ // ask the resourceOracle for the file contents and add it
+ URL resource = resourceLoader.getResource(sourceFileName);
+ if (nonNull(resource)) {
+ return resource.openStream();
+ }
+ }
+ return null;
+ }
+
/**
* Override to change the manner in which the symbol map is emitted.
*/
diff --git a/dev/core/src/com/google/gwt/dev/CompilePerms.java b/dev/core/src/com/google/gwt/dev/CompilePerms.java
index 3b8a1b042f8..2a65b87b77b 100644
--- a/dev/core/src/com/google/gwt/dev/CompilePerms.java
+++ b/dev/core/src/com/google/gwt/dev/CompilePerms.java
@@ -380,8 +380,12 @@ private boolean precompileAndCompile(TreeLogger logger, String moduleName,
if (precompilation == null) {
return false;
}
+
+ boolean embedSourcesContent = compilerContext.getModule()
+ .shouldEmbedSourceMapContents();
+
// TODO: move to precompile() after params are refactored
- if (!options.shouldSaveSource()) {
+ if (!options.shouldSaveSource() && !embedSourcesContent) {
precompilation.removeSourceArtifacts(logger);
}
diff --git a/dev/core/src/com/google/gwt/dev/Compiler.java b/dev/core/src/com/google/gwt/dev/Compiler.java
index 6e122046bde..31a22f8c197 100644
--- a/dev/core/src/com/google/gwt/dev/Compiler.java
+++ b/dev/core/src/com/google/gwt/dev/Compiler.java
@@ -193,8 +193,11 @@ public static boolean compile(
if (precompilation == null) {
return false;
}
+
+ boolean embedSourcesContent = compilerContext.getModule()
+ .shouldEmbedSourceMapContents();
// TODO: move to precompile() after params are refactored
- if (!options.shouldSaveSource()) {
+ if (!options.shouldSaveSource() && !embedSourcesContent) {
precompilation.removeSourceArtifacts(branch);
}
diff --git a/dev/core/src/com/google/gwt/dev/Link.java b/dev/core/src/com/google/gwt/dev/Link.java
index d7d00625010..a0e02c09db0 100644
--- a/dev/core/src/com/google/gwt/dev/Link.java
+++ b/dev/core/src/com/google/gwt/dev/Link.java
@@ -415,7 +415,10 @@ private static void doProduceOutput(TreeLogger logger, ArtifactSet artifacts,
linkerContext.produceOutput(logger, artifacts, Visibility.Private,
extraFileSet);
- if (saveSources) {
+ boolean embedSourcesContent = linkerContext.getModule()
+ .shouldEmbedSourceMapContents();
+
+ if (saveSources && !embedSourcesContent) {
// Assume that all source code is available in the compiler's classpath.
// (This will have to be adjusted to work with Super Dev Mode.)
ResourceLoader loader = ResourceLoaders.fromContextClassLoader();
diff --git a/dev/core/src/com/google/gwt/dev/Precompile.java b/dev/core/src/com/google/gwt/dev/Precompile.java
index a81bdc80a0c..8386a61f231 100644
--- a/dev/core/src/com/google/gwt/dev/Precompile.java
+++ b/dev/core/src/com/google/gwt/dev/Precompile.java
@@ -443,7 +443,7 @@ public boolean run(TreeLogger logger) throws UnableToCompleteException {
return false;
}
// TODO: move to precompile() after params are refactored
- if (!options.shouldSaveSource()) {
+ if (!options.shouldSaveSource() && !module.shouldEmbedSourceMapContents()) {
precompilation.removeSourceArtifacts(logger);
}
Util.writeObjectAsFile(logger, precompilationFile, precompilation);
diff --git a/dev/core/src/com/google/gwt/dev/PrecompileOnePerm.java b/dev/core/src/com/google/gwt/dev/PrecompileOnePerm.java
index dd679c6948d..9a123d6a5c0 100644
--- a/dev/core/src/com/google/gwt/dev/PrecompileOnePerm.java
+++ b/dev/core/src/com/google/gwt/dev/PrecompileOnePerm.java
@@ -233,8 +233,11 @@ private boolean precompilePermutation(TreeLogger logger,
return false;
}
+ boolean embedSourcesContent = compilerContext.getModule()
+ .shouldEmbedSourceMapContents();
+
// TODO: precompile should do this after we get the parameter passing refactored.
- if (!options.shouldSaveSource()) {
+ if (!options.shouldSaveSource() && embedSourcesContent) {
precompilation.removeSourceArtifacts(logger);
}
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
index 9b91b3bb41a..ff68743b463 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
@@ -67,6 +67,9 @@
* XML for unit tests.
*/
public class ModuleDef implements DepsInfoProvider {
+
+ public static final String EMBED_SOURCE_MAPS = "compiler.embedSourceMaps";
+
private static final ResourceFilter NON_JAVA_RESOURCES = new ResourceFilter() {
@Override
public boolean allows(String path) {
@@ -628,6 +631,22 @@ public synchronized void setNameOverride(String nameOverride) {
this.nameOverride = nameOverride;
}
+ /**
+ * Checks if embedding sources content inside sourceMaps json is enabled or not.
+ * @return the boolean value true/false of compiler.embedSourceMaps
+ * configuration property
+ */
+ public boolean shouldEmbedSourceMapContents() {
+ return getProperties()
+ .getConfigurationProperties()
+ .stream()
+ .filter(configurationProperty -> EMBED_SOURCE_MAPS.equals(
+ configurationProperty.getName()))
+ .findFirst()
+ .map(configurationProperty -> Boolean.valueOf(configurationProperty.getValue()))
+ .orElse(false);
+ }
+
void addBindingPropertyDefinedValue(BindingProperty bindingProperty, String token) {
bindingProperty.addDefinedValue(bindingProperty.getRootCondition(), token);
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index a51cd7f9597..5895e377d82 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -1201,6 +1201,7 @@ private String buildEntryMethodHolder(StandardGeneratorContext context,
}
EntryMethodHolderGenerator entryMethodHolderGenerator = new EntryMethodHolderGenerator();
+ context.setCurrentGenerator(EntryMethodHolderGenerator.class);
String entryMethodHolderTypeName =
entryMethodHolderGenerator.generate(logger, context, module.getCanonicalName());
context.finish(logger);
diff --git a/eclipse/dev/.classpath b/eclipse/dev/.classpath
index ac771cbca58..a84d801f71e 100644
--- a/eclipse/dev/.classpath
+++ b/eclipse/dev/.classpath
@@ -21,7 +21,7 @@
-
+
diff --git a/eclipse/dev/codeserver/.classpath b/eclipse/dev/codeserver/.classpath
index 88a6968b93b..bc64bf5c128 100644
--- a/eclipse/dev/codeserver/.classpath
+++ b/eclipse/dev/codeserver/.classpath
@@ -3,7 +3,7 @@
-
+
diff --git a/eclipse/user/.classpath b/eclipse/user/.classpath
index 75f936204d0..1fa63d0ffcc 100644
--- a/eclipse/user/.classpath
+++ b/eclipse/user/.classpath
@@ -44,7 +44,7 @@
-
+
diff --git a/requestfactory/build.xml b/requestfactory/build.xml
index c835c86da4e..ba82e804e35 100755
--- a/requestfactory/build.xml
+++ b/requestfactory/build.xml
@@ -41,6 +41,9 @@
+
+
+
diff --git a/servlet/build.xml b/servlet/build.xml
index 47d554892f1..9f23dfcdf5f 100644
--- a/servlet/build.xml
+++ b/servlet/build.xml
@@ -24,11 +24,11 @@
-
-
+
+
+
-
@@ -70,11 +70,11 @@
-
-
+
+
+
-
diff --git a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
index df4aca4b873..fdeb60705fc 100644
--- a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
+++ b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
@@ -96,6 +96,12 @@
+
+
+
+
diff --git a/user/src/com/google/gwt/core/server/StackTraceDeobfuscator.java b/user/src/com/google/gwt/core/server/StackTraceDeobfuscator.java
index 776e4cfd964..f6f37ef59f4 100644
--- a/user/src/com/google/gwt/core/server/StackTraceDeobfuscator.java
+++ b/user/src/com/google/gwt/core/server/StackTraceDeobfuscator.java
@@ -15,9 +15,9 @@
*/
package com.google.gwt.core.server;
+import com.google.gwt.thirdparty.debugging.sourcemap.OriginalMapping;
import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapConsumerFactory;
import com.google.gwt.thirdparty.debugging.sourcemap.SourceMapping;
-import com.google.gwt.thirdparty.debugging.sourcemap.proto.Mapping;
import java.io.BufferedReader;
import java.io.File;
@@ -299,13 +299,13 @@ public final StackTraceElement resymbolize(StackTraceElement ste, String strongN
if (sourceMapCapable && fragmentId != -1 && column != -1) {
SourceMapping sourceMapping = loadSourceMap(strongName, fragmentId);
if (sourceMapping != null && ste.getLineNumber() > -1) {
- Mapping.OriginalMapping mappingForLine = sourceMapping
+ OriginalMapping mappingForLine = sourceMapping
.getMappingForLine(jsLineNumber, column);
if (mappingForLine != null) {
if (declaringClass == null || declaringClass.equals(ste.getClassName())) {
declaringClass = mappingForLine.getOriginalFile();
- methodName = mappingForLine.getIdentifier();
+ methodName = mappingForLine.getIdentifier().orElse(null);
}
fileName = mappingForLine.getOriginalFile();
lineNumber = mappingForLine.getLineNumber();