This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit 7c5e83f4b3b166e9c9d2b78b8e30f94c00368a3b Author: Josh Tynjala <[email protected]> AuthorDate: Mon Jul 15 11:31:44 2019 -0700 Better detection of goog.provide() and externs classes This allows libraries to properly use external-library-path with other libraries, so that classes don't get added to the wrong SWCs. This also is part of a fix to the issue of CSS being added to apps from libraries that aren't actually used. --- compiler-externc/build.xml | 1 + .../apache/royale/compiler/clients/COMPJSC.java | 7 +- .../royale/compiler/clients/COMPJSCNative.java | 7 +- .../royale/compiler/clients/COMPJSCRoyale.java | 7 +- .../codegen/js/jx/PackageHeaderEmitter.java | 6 +- .../codegen/js/royale/JSRoyaleEmitter.java | 11 ++-- .../codegen/mxml/royale/MXMLRoyaleEmitter.java | 75 +++++++++++++-------- .../compiler/internal/graph/GoogDepsWriter.java | 49 ++++++++++---- .../internal/projects/RoyaleJSProject.java | 76 ++++++++++++++++++++-- .../compiler/internal/targets/RoyaleJSTarget.java | 2 + compiler-jx/src/test/build.xml | 26 +++++++- compiler-jx/src/test/config/compile-js-config.xml | 46 +++++++++++++ .../internal/codegen/mxml/TestMXMLApplication.java | 7 ++ .../mxml/royale/TestRoyaleMXMLApplication.java | 5 ++ .../royale/compiler/internal/test/ASTestBase.java | 14 ++++ .../compiler/internal/test/MXMLTestBase.java | 16 +++++ .../compiler/internal/test/RoyaleTestBase.java | 4 ++ .../royale/compiler/internal/test/TestBase.java | 8 +-- .../src/test/royale/XML.as | 0 .../src/test/royale/XMLList.as | 0 20 files changed, 299 insertions(+), 68 deletions(-) diff --git a/compiler-externc/build.xml b/compiler-externc/build.xml index 773a0ee..57b349f 100644 --- a/compiler-externc/build.xml +++ b/compiler-externc/build.xml @@ -161,6 +161,7 @@ <target name="clean" description="clean"> <delete dir="${compiler-externc}/target/classes"/> + <delete file="${compiler-externc}/target/js.swc"/> </target> <target name="wipe" depends="clean" description="Wipes everything that didn't come from Git."> 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 4625a41..23da56e 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 @@ -49,7 +49,6 @@ import org.apache.royale.compiler.driver.js.IJSApplication; import org.apache.royale.compiler.exceptions.ConfigurationException; import org.apache.royale.compiler.exceptions.ConfigurationException.IOError; import org.apache.royale.compiler.exceptions.ConfigurationException.MustSpecifyTarget; -import org.apache.royale.compiler.internal.codegen.js.JSWriter; import org.apache.royale.compiler.internal.driver.js.goog.JSGoogCompcConfiguration; import org.apache.royale.compiler.internal.projects.CompilerProject; import org.apache.royale.compiler.internal.targets.RoyaleSWCTarget; @@ -478,8 +477,10 @@ public class COMPJSC extends MXMLJSC ByteArrayOutputStream sourceMapTemp = null; boolean isExterns = false; - if (writer instanceof JSWriter) - isExterns = ((JSWriter)writer).isExterns(); + if(cu.getDefinitionPromises().size() > 0) + { + isExterns = project.isExterns(cu.getDefinitionPromises().get(0).getQualifiedName()); + } // if the file is @externs DON'T create source map file if (project.config.getSourceMap() && !isExterns) 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 e77bc1f..57d2ead 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 @@ -45,7 +45,6 @@ import org.apache.royale.compiler.driver.js.IJSApplication; import org.apache.royale.compiler.exceptions.ConfigurationException; import org.apache.royale.compiler.exceptions.ConfigurationException.IOError; import org.apache.royale.compiler.exceptions.ConfigurationException.MustSpecifyTarget; -import org.apache.royale.compiler.internal.codegen.js.JSWriter; import org.apache.royale.compiler.internal.driver.mxml.jsc.MXMLJSCJSSWCBackend; import org.apache.royale.compiler.internal.parsing.as.RoyaleASDocDelegate; import org.apache.royale.compiler.internal.projects.CompilerProject; @@ -332,8 +331,10 @@ public class COMPJSCNative extends MXMLJSCNative ByteArrayOutputStream sourceMapTemp = null; boolean isExterns = false; - if (writer instanceof JSWriter) - isExterns = ((JSWriter)writer).isExterns(); + if(cu.getDefinitionPromises().size() > 0) + { + isExterns = project.isExterns(cu.getDefinitionPromises().get(0).getQualifiedName()); + } // if the file is @externs DON'T create source map file if (project.config.getSourceMap() && !isExterns) 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 a83aae9..1ca37df 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 @@ -48,7 +48,6 @@ import org.apache.royale.compiler.driver.js.IJSApplication; import org.apache.royale.compiler.exceptions.ConfigurationException; import org.apache.royale.compiler.exceptions.ConfigurationException.IOError; import org.apache.royale.compiler.exceptions.ConfigurationException.MustSpecifyTarget; -import org.apache.royale.compiler.internal.codegen.js.JSWriter; import org.apache.royale.compiler.internal.driver.mxml.royale.MXMLRoyaleSWCBackend; import org.apache.royale.compiler.internal.parsing.as.RoyaleASDocDelegate; import org.apache.royale.compiler.internal.projects.CompilerProject; @@ -372,8 +371,10 @@ public class COMPJSCRoyale extends MXMLJSCRoyale ByteArrayOutputStream sourceMapTemp = null; boolean isExterns = false; - if (writer instanceof JSWriter) - isExterns = ((JSWriter)writer).isExterns(); + if(cu.getDefinitionPromises().size() > 0) + { + isExterns = project.isExterns(cu.getDefinitionPromises().get(0).getQualifiedName()); + } // if the file is @externs DON'T create source map file if (project.config.getSourceMap() && !isExterns) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java index 57cfc76..d5ef151 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageHeaderEmitter.java @@ -392,9 +392,13 @@ public class PackageHeaderEmitter extends JSSubEmitter implements continue; } - if (writtenRequires.indexOf(imp) == -1) + if(!project.isGoogProvided(imp)) { + continue; + } + if (writtenRequires.indexOf(imp) == -1) + { /* goog.require('x');\n */ write(JSGoogEmitterTokens.GOOG_REQUIRE); write(ASEmitterTokens.PAREN_OPEN); diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java index a5f43e6..d3a65ab 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java @@ -699,12 +699,12 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter { if (getModel().inStaticInitializer) if (!staticUsedNames.contains(name) && !NativeUtils.isJSNative(name) - && !isExternal(name) && !getModel().getCurrentClass().getQualifiedName().equals(name) + && isGoogProvided(name) && !getModel().getCurrentClass().getQualifiedName().equals(name) && (getModel().primaryDefinitionQName == null || !getModel().primaryDefinitionQName.equals(name))) staticUsedNames.add(name); - if (!usedNames.contains(name) && !isExternal(name)) + if (!usedNames.contains(name) && isGoogProvided(name)) usedNames.add(name); } return name; @@ -1524,13 +1524,10 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter getModel().needLanguage = true; } - boolean isExternal(String className) + boolean isGoogProvided(String className) { ICompilerProject project = getWalker().getProject(); - ICompilationUnit cu = project.resolveQNameToCompilationUnit(className); - if (cu == null) return false; // unit testing - - return ((RoyaleJSProject)project).isExternalLinkage(cu); + return ((RoyaleJSProject)project).isGoogProvided(className); } } diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java index 826f44e..f5e7cba 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java @@ -249,11 +249,15 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements if (subDocumentNames.contains(usedName)) continue; if (royaleProject != null) { + if (!isGoogProvided(usedName)) + { + continue; + } ICompilationUnit cu = royaleProject.resolveQNameToCompilationUnit(usedName); - if (cu != null && royaleProject.isExternalLinkage(cu)) - continue; - if (cu == null) - System.out.println("didn't find CompilationUnit for " + usedName); + if (cu == null) + { + System.out.println("didn't find CompilationUnit for " + usedName); + } } namesToAdd.add(usedName); } @@ -311,10 +315,14 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements boolean firstOne = true; for (String mixin : mixins) { - if (isExternal(mixin)) - continue; - if (!firstOne) - mixinInject += ", "; + if (!isGoogProvided(mixin)) + { + continue; + } + if (!firstOne) + { + mixinInject += ", "; + } mixinInject += mixin; firstOne = false; StringBuilder appendString = new StringBuilder(); @@ -340,10 +348,14 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements boolean firstOne = true; for (String className : aliases.keySet()) { - if (isExternal(className)) - continue; - if (!firstOne) - aliasInject += ", "; + if (!isGoogProvided(className)) + { + continue; + } + if (!firstOne) + { + aliasInject += ", "; + } aliasInject += "\"" + className + "\": "; String alias = aliases.get(className); aliasInject += "\"" + alias + "\""; @@ -373,8 +385,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements locales.toArray(localeNames); for (String locale : localeNames) { - if (!firstOne) - localeInject += ", "; + if (!firstOne) + { + localeInject += ", "; + } localeInject += "\"" + locale + "\""; firstOne = false; } @@ -390,8 +404,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements boolean firstOne = true; for (String bundle : bundles) { - if (!firstOne) - bundleInject += ", "; + if (!firstOne) + { + bundleInject += ", "; + } bundleInject += "\"" + bundle + "\""; firstOne = false; } @@ -1535,7 +1551,9 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements for (IExpressionNode param : params) { if (!firstone) + { sb.append(ASEmitterTokens.COMMA.getToken()); + } firstone = false; sb.append(asEmitter.stringifyNode(param)); } @@ -3012,12 +3030,18 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements if (subDocumentNames.contains(name)) return documentDefinition.getQualifiedName() + "." + name; if (NativeUtils.isJSNative(name)) return name; - if (inStaticInitializer) - if (!staticUsedNames.contains(name) && !NativeUtils.isJSNative(name) && !isExternal(name)) - staticUsedNames.add(name); + if (inStaticInitializer) + { + if (!staticUsedNames.contains(name) && !NativeUtils.isJSNative(name) && isGoogProvided(name)) + { + staticUsedNames.add(name); + } + } - if (useName && !usedNames.contains(name) && !isExternal(name)) - usedNames.add(name); + if (useName && !usedNames.contains(name) && isGoogProvided(name)) + { + usedNames.add(name); + } return name; } @@ -3242,14 +3266,11 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements //System.out.println("mxml implements "+list); interfaceList = list.toString(); } - - boolean isExternal(String className) + + boolean isGoogProvided(String className) { ICompilerProject project = getMXMLWalker().getProject(); - ICompilationUnit cu = project.resolveQNameToCompilationUnit(className); - if (cu == null) return false; // unit testing - - return ((RoyaleJSProject)project).isExternalLinkage(cu); + return ((RoyaleJSProject)project).isGoogProvided(className); } @Override diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java index bfb08cf..66ef9a3 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java @@ -196,15 +196,19 @@ public class GoogDepsWriter { ArrayList<String> restOfDeps = new ArrayList<String>(); for (String dep: mainDep.deps) { - if (!isExternal(dep)) + if (isGoogProvided(dep)) + { restOfDeps.add(dep); + } } if (mainDep.fileInfo.impls != null) { for (String dep: mainDep.fileInfo.impls) { - if (!isExternal(dep)) + if (isGoogProvided(dep)) + { restOfDeps.add(dep); + } } } DependencyTypeSet dependencyTypes = DependencyTypeSet.allOf(); @@ -220,8 +224,10 @@ public class GoogDepsWriter { { for (String d : gd.fileInfo.impls) { - if (!restOfDeps.contains(d) && !gd.fileInfo.isExtern && !isExternal(d) && !usedDeps.contains(d)) + if (!restOfDeps.contains(d) && !gd.fileInfo.isExtern && isGoogProvided(d) && !usedDeps.contains(d)) + { restOfDeps.add(d); + } } } continue; @@ -229,15 +235,19 @@ public class GoogDepsWriter { ICompilationUnit unit = requireMap.get(gd.className); if (unit == null) { - if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && !isExternal(gd.className) && !usedDeps.contains(gd.className)) + if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && isGoogProvided(gd.className) && !usedDeps.contains(gd.className)) + { restOfDeps.add(gd.className); + } continue; } Set<ICompilationUnit> deps = graph.getDirectReverseDependencies(unit, dependencyTypes); if (deps.size() == 0) { - if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && !isExternal(gd.className) && !usedDeps.contains(gd.className)) + if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && isGoogProvided(gd.className) && !usedDeps.contains(gd.className)) + { restOfDeps.add(gd.className); + } } } appendDependencies(restOfDeps, mainDeps); @@ -307,7 +317,7 @@ public class GoogDepsWriter { problems.add(new MainDefinitionQNameProblem("Google Closure Library", mainName)); return false; } - if (isExternal(mainName)) + if (!isGoogProvided(mainName)) { problems.add(new MainDefinitionQNameProblem("External Libraries", mainName)); return false; @@ -411,7 +421,7 @@ public class GoogDepsWriter { GoogDep dep = depMap.get(name); if (dep == null) { - if (!isExternal(name)) + if (isGoogProvided(name)) { System.out.println("No GoogDep for " + name); //added this to prevent a NullPointerException when the @@ -516,7 +526,7 @@ public class GoogDepsWriter { ArrayList<String> deps = current.deps; for (String className : deps) { - if (!isGoogClass(className) && !isExternal(className)) + if (!isGoogClass(className) && isGoogProvided(className)) { GoogDep gd = depMap.get(className); if (gd == null) @@ -563,20 +573,24 @@ public class GoogDepsWriter { // first scan requires in case this is a module and some have been externed int j = main.fileInfo.googProvideLine + 1; while (j < fileLines.size() && !fileLines.get(j).contains(JSGoogEmitterTokens.GOOG_REQUIRE.getToken())) + { j++; + } while (j < fileLines.size() && fileLines.get(j).contains(JSGoogEmitterTokens.GOOG_REQUIRE.getToken())) { String line = fileLines.get(j); int c = line.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken()); int c2 = line.indexOf(")"); String s = line.substring(c + 14, c2 - 1); - if (isExternal(s)) + if (!isGoogProvided(s)) { fileLines.remove(j); sourceMapConsumer = removeLineFromSourceMap(sourceMapConsumer, mainFile.getName(), j); } - else - j++; + else + { + j++; + } } int n = restOfDeps.size(); @@ -615,8 +629,10 @@ public class GoogDepsWriter { private void addDeps(String className) { - if (depMap.containsKey(className) || isGoogClass(className) || isExternal(className)) + if (depMap.containsKey(className) || isGoogClass(className) || !isGoogProvided(className)) + { return; + } // build goog dependency list GoogDep gd = new GoogDep(); @@ -734,7 +750,7 @@ public class GoogDepsWriter { String s = line.substring(c + 14, c2 - 1); if (((gd.fileInfo.impls == null || !gd.fileInfo.impls.contains(s)) && (gd.fileInfo.staticDeps == null || !gd.fileInfo.staticDeps.contains(s))) || - isExternal(s)) + !isGoogProvided(s)) { // don't remove the require if some class needs it at static initialization // time @@ -768,7 +784,7 @@ public class GoogDepsWriter { lastRequireLine = gd.fileInfo.googProvideLine + 1; for (String dep : gd.fileInfo.staticDeps) { - if (!writtenRequires.contains(dep) && !isExternal(dep)) + if (!writtenRequires.contains(dep) && isGoogProvided(dep)) { StringBuilder lineBuilder = new StringBuilder(); lineBuilder.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken()) @@ -1530,6 +1546,11 @@ public class GoogDepsWriter { return path; } + boolean isGoogProvided(String className) + { + return ((RoyaleJSProject)project).isGoogProvided(className); + } + boolean isExternal(String className) { ICompilationUnit cu = project.resolveQNameToCompilationUnit(className); diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java index 42e647c..231a4c0 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java @@ -64,9 +64,11 @@ import org.apache.royale.compiler.targets.ITargetSettings; import org.apache.royale.compiler.tree.as.IASNode; import org.apache.royale.compiler.tree.as.IClassNode; import org.apache.royale.compiler.tree.as.IDefinitionNode; +import org.apache.royale.compiler.tree.as.IDocumentableDefinitionNode; import org.apache.royale.compiler.tree.as.IInterfaceNode; import org.apache.royale.compiler.units.ICompilationUnit; import org.apache.royale.compiler.units.ICompilationUnit.UnitType; +import org.apache.royale.swc.ISWC; import com.google.common.collect.ImmutableList; @@ -180,14 +182,18 @@ public class RoyaleJSProject extends RoyaleProject // inheritance is important so remember it if (reqs.get(qname) != DependencyType.INHERITANCE) { - if (!isExternalLinkage(to)) + if (isGoogProvided(qname)) + { reqs.put(qname, dt); + } } } - else if (!isExternalLinkage(to) || qname.equals("Namespace")) + else if (isGoogProvided(qname) || qname.equals("Namespace")) { if (qname.equals("XML")) + { needXML = true; + } reqs.put(qname, dt); } } @@ -236,10 +242,13 @@ public class RoyaleJSProject extends RoyaleProject if (!interfacesArr.containsKey(qname)) { - if (!isExternalLinkage(to)) - interfacesArr.put(qname, qname); + if (isGoogProvided(qname)) + { + interfacesArr.put(qname, qname); + } } } + public boolean needLanguage; public boolean needCSS; public boolean needXML; @@ -274,6 +283,65 @@ public class RoyaleJSProject extends RoyaleProject return null; } + public boolean isExterns(String qname) + { + ICompilationUnit cu = resolveQNameToCompilationUnit(qname); + if (cu == null) + { + return false; + } + if (cu.getCompilationUnitType().equals(ICompilationUnit.UnitType.SWC_UNIT)) + { + return !isGoogProvided(qname); + } + else if (!cu.getCompilationUnitType().equals(ICompilationUnit.UnitType.AS_UNIT)) + { + return false; + } + + IDefinition def = resolveQNameToDefinition(qname); + if (def == null) + { + return false; + } + + IDefinitionNode node = def.getNode(); + if (!(node instanceof IDocumentableDefinitionNode)) + { + return false; + } + + IDocumentableDefinitionNode docNode = (IDocumentableDefinitionNode) node; + IASDocComment comment = docNode.getASDocComment(); + if (!(comment instanceof ASDocComment)) + { + return false; + } + ASDocComment royaleComment = (ASDocComment) comment; + return royaleComment.commentNoEnd().contains(JSRoyaleEmitterTokens.EXTERNS.getToken()); + } + + public boolean isGoogProvided(String qname) + { + ICompilationUnit cu = resolveQNameToCompilationUnit(qname); + if (cu == null) + { + //TODO: maybe this this should be false because we can't actually + //check whether it's a goog.provide() object or not + return true; + } + + if (cu.getCompilationUnitType().equals(ICompilationUnit.UnitType.SWC_UNIT)) + { + SWCCompilationUnit swcUnit = (SWCCompilationUnit) cu; + ISWC swc = swcUnit.getSWC(); + String qnameFilePath = "js/out/" + qname.replace('.', '/') + ".js"; + return swc.getFile(qnameFilePath) != null; + } + + return !isExterns(qname); + } + public boolean isExternalLinkage(ICompilationUnit cu) { if (linkageChecker == null) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/targets/RoyaleJSTarget.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/targets/RoyaleJSTarget.java index 6155005..0fea71d 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/targets/RoyaleJSTarget.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/targets/RoyaleJSTarget.java @@ -311,7 +311,9 @@ public class RoyaleJSTarget extends JSTarget implements IJSTarget final File swcFile = new File(compilationUnit.getAbsoluteFilename()); final ICSSDocument defaultCSS = cssManager.getDefaultCSS(swcFile); if (defaultCSS != null) + { result.put(defaultCSS, swcFile); + } } } return result; diff --git a/compiler-jx/src/test/build.xml b/compiler-jx/src/test/build.xml index b57aba0..532436e 100644 --- a/compiler-jx/src/test/build.xml +++ b/compiler-jx/src/test/build.xml @@ -31,11 +31,33 @@ <property name="maxmem" value="512" /> <property name="compiler" value="${compiler.tests}/../.."/> + <property name="compiler-externc" value="${compiler}/../compiler-externc"/> <target name="download" description="Downloads third-party JARs"> <ant antfile="${compiler.tests}/downloads.xml" dir="${compiler.tests}"/> <delete dir="${compiler.tests}/in"/> </target> + + <target name="js.swc"> + <copy file="${compiler-externc}/src/test/config/compile-as-config.xml" + todir="${compiler-externc}/target" /> + <java jar="${compiler}/lib/compc.jar" fork="true" + failonerror="true"> + <arg value="-targets=SWF"/> + <arg value="-load-config=${compiler-externc}/target/compile-as-config.xml" /> + <arg value="-output=${compiler-externc}/target/js.swc" /> + </java> + </target> + + <target name="custom.swc"> + <copy file="config/compile-js-config.xml" + todir="${compiler}/target" /> + <java jar="${compiler}/lib/compc.jar" fork="true" + failonerror="true"> + <arg value="-load-config=${compiler}/target/compile-js-config.xml" /> + <arg value="-output=${compiler}/target/custom.swc" /> + </java> + </target> <target name="compile.unit.tests"> <delete dir="${compiler}/target/test-classes"/> @@ -182,8 +204,8 @@ </junit> </target> - <target name="main" depends="unit.tests, integration.tests"/> - <target name="all" depends="unit.tests, integration.tests, typedef.tests, integration.tests.asjs"/> + <target name="main" depends="js.swc, custom.swc, unit.tests, integration.tests"/> + <target name="all" depends="main, typedef.tests, integration.tests.asjs"/> <target name="clean"> <delete dir="${compiler.tests}/bin"/> diff --git a/compiler-jx/src/test/config/compile-js-config.xml b/compiler-jx/src/test/config/compile-js-config.xml new file mode 100644 index 0000000..68a3341 --- /dev/null +++ b/compiler-jx/src/test/config/compile-js-config.xml @@ -0,0 +1,46 @@ +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +--> +<royale-config> + + <compiler> + <accessible>true</accessible> + + <targets> + <target>SWF</target> + <target>JSRoyale</target> + </targets> + + <source-path> + <path-element>../../compiler/src/test/royale</path-element> + </source-path> + + <external-library-path> + <path-element>../../compiler-externc/target/js.swc</path-element> + </external-library-path> + + <warn-no-constructor>false</warn-no-constructor> + </compiler> + + <warn-public-vars>false</warn-public-vars> + + <include-sources> + <path-element>../../compiler/src/test/royale</path-element> + </include-sources> + +</royale-config> diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/TestMXMLApplication.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/TestMXMLApplication.java index 0aa5601..0e39169 100644 --- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/TestMXMLApplication.java +++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/TestMXMLApplication.java @@ -18,6 +18,8 @@ */ package org.apache.royale.compiler.internal.codegen.mxml; +import static org.junit.Assert.assertNotNull; + import org.apache.royale.compiler.internal.test.MXMLTestBase; import org.apache.royale.compiler.tree.mxml.IMXMLFileNode; import org.junit.Test; @@ -33,6 +35,7 @@ public class TestMXMLApplication extends MXMLTestBase + "</custom:TestInstance>"; IMXMLFileNode node = compileMXML(code); + assertNotNull(node); mxmlBlockWalker.visitFile(node); @@ -48,6 +51,7 @@ public class TestMXMLApplication extends MXMLTestBase + "</custom:TestInstance>"; IMXMLFileNode node = compileMXML(code); + assertNotNull(node); mxmlBlockWalker.visitFile(node); @@ -64,6 +68,7 @@ public class TestMXMLApplication extends MXMLTestBase + "</custom:TestInstance>"; IMXMLFileNode node = compileMXML(code); + assertNotNull(node); mxmlBlockWalker.visitFile(node); @@ -80,6 +85,7 @@ public class TestMXMLApplication extends MXMLTestBase + " ]]></fx:Script>" + "</custom:TestInstance>"; IMXMLFileNode node = compileMXML(code); + assertNotNull(node); mxmlBlockWalker.visitFile(node); @@ -99,6 +105,7 @@ public class TestMXMLApplication extends MXMLTestBase + " </fx:Declarations>" + "</custom:TestInstance>"; IMXMLFileNode node = compileMXML(code); + assertNotNull(node); mxmlBlockWalker.visitFile(node); diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java index 19f524a..deec96c 100644 --- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java +++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/mxml/royale/TestRoyaleMXMLApplication.java @@ -19,6 +19,7 @@ package org.apache.royale.compiler.internal.codegen.mxml.royale; import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import org.apache.royale.compiler.clients.MXMLJSC; @@ -57,6 +58,7 @@ public class TestRoyaleMXMLApplication extends RoyaleTestBase IMXMLFileNode node = compileMXML(fileName, true, new File(testAdapter.getUnitTestBaseDir(), "royale/files").getPath(), false); + assertNotNull(node); mxmlBlockWalker.visitFile(node); @@ -79,6 +81,7 @@ public class TestRoyaleMXMLApplication extends RoyaleTestBase IMXMLFileNode node = compileMXML(fileName, true, new File(testAdapter.getUnitTestBaseDir(), "royale/files").getPath(), false); + assertNotNull(node); mxmlBlockWalker.visitFile(node); @@ -94,6 +97,7 @@ public class TestRoyaleMXMLApplication extends RoyaleTestBase IMXMLFileNode node = compileMXML(fileName, true, new File(testAdapter.getUnitTestBaseDir(), "royale/files").getPath(), false); + assertNotNull(node); mxmlBlockWalker.visitFile(node); @@ -109,6 +113,7 @@ public class TestRoyaleMXMLApplication extends RoyaleTestBase IMXMLFileNode node = compileMXML(fileName, true, new File(testAdapter.getUnitTestBaseDir(), "royale/files").getPath(), false); + assertNotNull(node); mxmlBlockWalker.visitFile(node); diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/ASTestBase.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/ASTestBase.java index 88ea788..807c950 100644 --- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/ASTestBase.java +++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/ASTestBase.java @@ -35,6 +35,7 @@ import org.apache.royale.compiler.tree.as.IInterfaceNode; import org.apache.royale.compiler.tree.as.INamespaceAccessExpressionNode; import org.apache.royale.compiler.tree.as.IUnaryOperatorNode; import org.apache.royale.compiler.tree.as.IVariableNode; +import org.apache.royale.utils.FilenameNormalization; import org.apache.royale.utils.ITestAdapter; import org.apache.royale.utils.TestAdapterFactory; import org.junit.Ignore; @@ -57,6 +58,19 @@ public class ASTestBase extends TestBase } @Override + protected void addDependencies() + { + if (libraries.size() == 0) + { + String jsSwcPath = FilenameNormalization.normalize("../compiler-externc/target/js.swc"); + libraries.add(new File(jsSwcPath)); + String customSwcPath = FilenameNormalization.normalize("../compiler-jx/target/custom.swc"); + libraries.add(new File(customSwcPath)); + } + super.addDependencies(); + } + + @Override protected void addSourcePaths(List<File> sourcePaths) { //sourcePaths.add(new File(FilenameNormalization.normalize( diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/MXMLTestBase.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/MXMLTestBase.java index 5235ffc..7f8ba79 100644 --- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/MXMLTestBase.java +++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/MXMLTestBase.java @@ -18,6 +18,8 @@ */ package org.apache.royale.compiler.internal.test; +import static org.junit.Assert.assertNotNull; + import java.io.File; import java.util.List; @@ -54,6 +56,19 @@ public class MXMLTestBase extends TestBase } @Override + protected void addDependencies() + { + if (libraries.size() == 0) + { + String jsSwcPath = FilenameNormalization.normalize("../compiler-externc/target/js.swc"); + libraries.add(new File(jsSwcPath)); + String customSwcPath = FilenameNormalization.normalize("../compiler-jx/target/custom.swc"); + libraries.add(new File(customSwcPath)); + } + super.addDependencies(); + } + + @Override protected void addLibraries(List<File> libraries) { //libraries.addAll(testAdapter.getLibraries(true)); @@ -103,6 +118,7 @@ public class MXMLTestBase extends TestBase + "</custom:TestInstance>"; IMXMLFileNode node = compileMXML(code); + assertNotNull(node); if (wrapLevel >= WRAP_LEVEL_NODE) // for now: attributes { diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/RoyaleTestBase.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/RoyaleTestBase.java index ae810bc..5f7a8bd 100644 --- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/RoyaleTestBase.java +++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/RoyaleTestBase.java @@ -18,6 +18,8 @@ */ package org.apache.royale.compiler.internal.test; +import static org.junit.Assert.assertNotNull; + import java.io.File; import java.util.List; @@ -98,6 +100,7 @@ public class RoyaleTestBase extends TestBase + code + "]]></fx:Script></basic:Application>"; IMXMLFileNode node = compileMXML(code); + assertNotNull(node); return findFirstASDescendantOfType(node, type); } @@ -113,6 +116,7 @@ public class RoyaleTestBase extends TestBase } IMXMLFileNode node = compileMXML(code); + assertNotNull(node); return findFirstDescendantOfType(node, type); } diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/TestBase.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/TestBase.java index a89aa85..c436fd9 100644 --- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/TestBase.java +++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/TestBase.java @@ -102,9 +102,9 @@ public class TestBase implements ITestBase protected File tempDir; - private List<File> sourcePaths = new ArrayList<File>(); - private List<File> libraries = new ArrayList<File>(); - private List<IMXMLNamespaceMapping> namespaceMappings = new ArrayList<IMXMLNamespaceMapping>(); + protected List<File> sourcePaths = new ArrayList<File>(); + protected List<File> libraries = new ArrayList<File>(); + protected List<IMXMLNamespaceMapping> namespaceMappings = new ArrayList<IMXMLNamespaceMapping>(); @Before public void setUp() @@ -695,7 +695,7 @@ public class TestBase implements ITestBase String jsSwcPath = FilenameNormalization.normalize("../compiler-externc/target/js.swc"); libraries.add(new File(jsSwcPath)); String customSwcPath = FilenameNormalization.normalize("../compiler/target/custom.swc"); - libraries.add(new File(customSwcPath)); + libraries.add(new File(customSwcPath)); } addNamespaceMappings(namespaceMappings); diff --git a/compiler-externc/src/test/royale/XML.as b/compiler/src/test/royale/XML.as similarity index 100% rename from compiler-externc/src/test/royale/XML.as rename to compiler/src/test/royale/XML.as diff --git a/compiler-externc/src/test/royale/XMLList.as b/compiler/src/test/royale/XMLList.as similarity index 100% rename from compiler-externc/src/test/royale/XMLList.as rename to compiler/src/test/royale/XMLList.as
