COMPJSC: supports custom source-map-source-root when building .swc files
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
index c61356a..e367473 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
@@ -26,6 +26,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.charset.Charset;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
@@ -37,6 +38,10 @@
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
+import com.google.debugging.sourcemap.SourceMapConsumerV3;
+import com.google.debugging.sourcemap.SourceMapGeneratorV3;
+import com.google.debugging.sourcemap.SourceMapParseException;
+
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.royale.compiler.clients.problems.ProblemPrinter;
@@ -60,6 +65,7 @@
import org.apache.royale.compiler.targets.ITarget.TargetType;
import org.apache.royale.compiler.targets.ITargetSettings;
import org.apache.royale.compiler.units.ICompilationUnit;
+import org.apache.royale.compiler.utils.SourceMapUtils;
import org.apache.royale.swc.ISWCFileEntry;
import org.apache.royale.swc.io.SWCReader;
import org.apache.royale.utils.ArgumentUtil;
@@ -489,32 +495,33 @@
}
writer.writeTo(temp, sourceMapTemp, null);
- String outputClassFile = getOutputClassFile(
+ File outputClassFile = getOutputClassFile(
cu.getQualifiedNames().get(0),
isExterns ? externsOut : jsOut,
- false).getPath();
- outputClassFile = outputClassFile.replace('\\', '/');
+ false);
+ String outputClassFilePath = outputClassFile.getPath();
+ outputClassFilePath = outputClassFilePath.replace('\\', '/');
if (config.isVerbose())
{
- System.out.println("Writing file: " + outputClassFile);
+ System.out.println("Writing file: " + outputClassFilePath);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
temp.writeTo(baos);
- writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
+ writeFileToZip(zipOutputStream, outputClassFilePath, baos, fileList);
if(sourceMapTemp != null)
{
- String sourceMapFile = getOutputSourceMapFile(
+ String sourceMapFilePath = getOutputSourceMapFile(
cu.getQualifiedNames().get(0),
isExterns ? externsOut : jsOut,
false).getPath();
- sourceMapFile = sourceMapFile.replace('\\', '/');
+ sourceMapFilePath = sourceMapFilePath.replace('\\', '/');
if (config.isVerbose())
{
- System.out.println("Writing file: " + sourceMapFile);
+ System.out.println("Writing file: " + sourceMapFilePath);
}
baos = new ByteArrayOutputStream();
- sourceMapTemp.writeTo(baos);
- writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
+ processSourceMap(sourceMapTemp, baos, outputClassFile, symbol);
+ writeFileToZip(zipOutputStream, sourceMapFilePath, baos, fileList);
}
writer.close();
}
@@ -676,6 +683,45 @@
return compilationSuccess;
}
+ private void processSourceMap(ByteArrayOutputStream sourceMapTemp, ByteArrayOutputStream baos, File outputClassFile, String symbol)
+ {
+ String sourceMapSourceRoot = project.config.getSourceMapSourceRoot();
+ if(sourceMapSourceRoot != null && sourceMapSourceRoot.length() > 0)
+ {
+ String sourceMapContents = sourceMapTemp.toString(Charset.forName("utf8"));
+ SourceMapConsumerV3 sourceMapConsumer = new SourceMapConsumerV3();
+ try
+ {
+ sourceMapConsumer.parse(sourceMapContents);
+ }
+ catch(SourceMapParseException e)
+ {
+ sourceMapConsumer = null;
+ }
+ if (sourceMapConsumer != null && !sourceMapSourceRoot.equals(sourceMapConsumer.getSourceRoot()))
+ {
+ SourceMapGeneratorV3 sourceMapGenerator = SourceMapUtils.sourceMapConsumerToGeneratorWithRemappedSourceRoot(sourceMapConsumer, sourceMapSourceRoot, symbol);
+ String newSourceMapContents = SourceMapUtils.sourceMapGeneratorToString(sourceMapGenerator, outputClassFile.getName());
+ try
+ {
+ IOUtils.write(newSourceMapContents, baos, Charset.forName("utf8"));
+ }
+ catch(IOException e)
+ {
+ }
+ return;
+ }
+ }
+ try
+ {
+ sourceMapTemp.writeTo(baos);
+ }
+ catch(IOException e)
+ {
+
+ }
+ }
+
private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
{
long fileDate = System.currentTimeMillis();
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
index 125e93d..7f0f662 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
@@ -26,6 +26,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.charset.Charset;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
@@ -45,6 +46,10 @@
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
+import com.google.debugging.sourcemap.SourceMapConsumerV3;
+import com.google.debugging.sourcemap.SourceMapGeneratorV3;
+import com.google.debugging.sourcemap.SourceMapParseException;
+
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.royale.compiler.clients.problems.ProblemQuery;
@@ -69,6 +74,7 @@
import org.apache.royale.compiler.targets.ITarget.TargetType;
import org.apache.royale.compiler.targets.ITargetSettings;
import org.apache.royale.compiler.units.ICompilationUnit;
+import org.apache.royale.compiler.utils.SourceMapUtils;
import org.apache.royale.swc.ISWCFileEntry;
import org.apache.royale.swc.io.SWCReader;
@@ -354,32 +360,33 @@
}
writer.writeTo(temp, sourceMapTemp, null);
- String outputClassFile = getOutputClassFile(
+ File outputClassFile = getOutputClassFile(
cu.getQualifiedNames().get(0),
isExterns ? externsOut : jsOut,
- false).getPath();
- outputClassFile = outputClassFile.replace('\\', '/');
+ false);
+ String outputClassFilePath = outputClassFile.getPath();
+ outputClassFilePath = outputClassFilePath.replace('\\', '/');
if (config.isVerbose())
{
- System.out.println("Writing file: " + outputClassFile);
+ System.out.println("Writing file: " + outputClassFilePath);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
temp.writeTo(baos);
- writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
+ writeFileToZip(zipOutputStream, outputClassFilePath, baos, fileList);
if(sourceMapTemp != null)
{
- String sourceMapFile = getOutputSourceMapFile(
+ String sourceMapFilePath = getOutputSourceMapFile(
cu.getQualifiedNames().get(0),
isExterns ? externsOut : jsOut,
false).getPath();
- sourceMapFile = sourceMapFile.replace('\\', '/');
+ sourceMapFilePath = sourceMapFilePath.replace('\\', '/');
if (config.isVerbose())
{
- System.out.println("Writing file: " + sourceMapFile);
+ System.out.println("Writing file: " + sourceMapFilePath);
}
baos = new ByteArrayOutputStream();
- sourceMapTemp.writeTo(baos);
- writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
+ processSourceMap(sourceMapTemp, baos, outputClassFile, symbol);
+ writeFileToZip(zipOutputStream, sourceMapFilePath, baos, fileList);
}
writer.close();
}
@@ -473,6 +480,45 @@
return compilationSuccess;
}
+ private void processSourceMap(ByteArrayOutputStream sourceMapTemp, ByteArrayOutputStream baos, File outputClassFile, String symbol)
+ {
+ String sourceMapSourceRoot = project.config.getSourceMapSourceRoot();
+ if(sourceMapSourceRoot != null && sourceMapSourceRoot.length() > 0)
+ {
+ String sourceMapContents = sourceMapTemp.toString(Charset.forName("utf8"));
+ SourceMapConsumerV3 sourceMapConsumer = new SourceMapConsumerV3();
+ try
+ {
+ sourceMapConsumer.parse(sourceMapContents);
+ }
+ catch(SourceMapParseException e)
+ {
+ sourceMapConsumer = null;
+ }
+ if (sourceMapConsumer != null && !sourceMapSourceRoot.equals(sourceMapConsumer.getSourceRoot()))
+ {
+ SourceMapGeneratorV3 sourceMapGenerator = SourceMapUtils.sourceMapConsumerToGeneratorWithRemappedSourceRoot(sourceMapConsumer, sourceMapSourceRoot, symbol);
+ String newSourceMapContents = SourceMapUtils.sourceMapGeneratorToString(sourceMapGenerator, outputClassFile.getName());
+ try
+ {
+ IOUtils.write(newSourceMapContents, baos, Charset.forName("utf8"));
+ }
+ catch(IOException e)
+ {
+ }
+ return;
+ }
+ }
+ try
+ {
+ sourceMapTemp.writeTo(baos);
+ }
+ catch(IOException e)
+ {
+
+ }
+ }
+
private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
{
long fileDate = System.currentTimeMillis();
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
index 366de7e..a16bfd5 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
@@ -26,6 +26,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.charset.Charset;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
@@ -37,6 +38,10 @@
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
+import com.google.debugging.sourcemap.SourceMapConsumerV3;
+import com.google.debugging.sourcemap.SourceMapGeneratorV3;
+import com.google.debugging.sourcemap.SourceMapParseException;
+
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.royale.compiler.clients.problems.ProblemQuery;
@@ -62,6 +67,7 @@
import org.apache.royale.compiler.targets.ITargetSettings;
import org.apache.royale.compiler.units.ICompilationUnit;
import org.apache.royale.compiler.units.ICompilationUnit.UnitType;
+import org.apache.royale.compiler.utils.SourceMapUtils;
import org.apache.royale.swc.ISWCFileEntry;
import org.apache.royale.swc.io.SWCReader;
@@ -375,33 +381,34 @@
}
writer.writeTo(temp, sourceMapTemp, null);
- String outputClassFile = getOutputClassFile(
+ File outputClassFile = getOutputClassFile(
cu.getQualifiedNames().get(0),
isExterns ? externsOut : jsOut,
- false).getPath();
- outputClassFile = outputClassFile.replace('\\', '/');
+ false);
+ String outputClassFilePath = outputClassFile.getPath();
+ outputClassFilePath = outputClassFilePath.replace('\\', '/');
if (config.isVerbose())
{
- System.out.println("Writing file: " + outputClassFile);
+ System.out.println("Writing file: " + outputClassFilePath);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
temp.writeTo(baos);
- writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
+ writeFileToZip(zipOutputStream, outputClassFilePath, baos, fileList);
if(sourceMapTemp != null)
{
- String sourceMapFile = getOutputSourceMapFile(
- cu.getQualifiedNames().get(0),
- isExterns ? externsOut : jsOut,
- false).getPath();
- sourceMapFile = sourceMapFile.replace('\\', '/');
+ String sourceMapFilePath = getOutputSourceMapFile(
+ cu.getQualifiedNames().get(0),
+ isExterns ? externsOut : jsOut,
+ false).getPath();
+ sourceMapFilePath = sourceMapFilePath.replace('\\', '/');
if (config.isVerbose())
{
- System.out.println("Writing file: " + sourceMapFile);
+ System.out.println("Writing file: " + sourceMapFilePath);
}
baos = new ByteArrayOutputStream();
- sourceMapTemp.writeTo(baos);
- writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
+ processSourceMap(sourceMapTemp, baos, outputClassFile, symbol);
+ writeFileToZip(zipOutputStream, sourceMapFilePath, baos, fileList);
}
writer.close();
}
@@ -540,6 +547,45 @@
return compilationSuccess;
}
+ private void processSourceMap(ByteArrayOutputStream sourceMapTemp, ByteArrayOutputStream baos, File outputClassFile, String symbol)
+ {
+ String sourceMapSourceRoot = project.config.getSourceMapSourceRoot();
+ if(sourceMapSourceRoot != null && sourceMapSourceRoot.length() > 0)
+ {
+ String sourceMapContents = sourceMapTemp.toString(Charset.forName("utf8"));
+ SourceMapConsumerV3 sourceMapConsumer = new SourceMapConsumerV3();
+ try
+ {
+ sourceMapConsumer.parse(sourceMapContents);
+ }
+ catch(SourceMapParseException e)
+ {
+ sourceMapConsumer = null;
+ }
+ if (sourceMapConsumer != null && !sourceMapSourceRoot.equals(sourceMapConsumer.getSourceRoot()))
+ {
+ SourceMapGeneratorV3 sourceMapGenerator = SourceMapUtils.sourceMapConsumerToGeneratorWithRemappedSourceRoot(sourceMapConsumer, sourceMapSourceRoot, symbol);
+ String newSourceMapContents = SourceMapUtils.sourceMapGeneratorToString(sourceMapGenerator, outputClassFile.getName());
+ try
+ {
+ IOUtils.write(newSourceMapContents, baos, Charset.forName("utf8"));
+ }
+ catch(IOException e)
+ {
+ }
+ return;
+ }
+ }
+ try
+ {
+ sourceMapTemp.writeTo(baos);
+ }
+ catch(IOException e)
+ {
+
+ }
+ }
+
private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
{
long fileDate = System.currentTimeMillis();