in compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java [189:667]
public String postProcess(String output)
{
IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker()).getASEmitter();
Set<String> asEmitterUsedNames = ((JSRoyaleEmitter)asEmitter).usedNames;
JSRoyaleEmitter fjs = (JSRoyaleEmitter)asEmitter;
String currentClassName = fjs.getModel().getCurrentClass().getQualifiedName();
Set<String> removals = new HashSet<String>();
for (String usedName : asEmitterUsedNames) {
//remove any internal component that has been registered with the other emitter's usedNames
if (usedName.startsWith(currentClassName+".") && subDocumentNames.contains(usedName.substring(currentClassName.length()+1))) {
removals.add(usedName);
}
}
for (String usedName : removals)
{
asEmitterUsedNames.remove(usedName);
}
RoyaleJSProject fjp = (RoyaleJSProject) getMXMLWalker().getProject();
if (fjp.config == null || fjp.config.isVerbose())
{
System.out.println(currentClassName + " as: " + asEmitterUsedNames.toString());
System.out.println(currentClassName + " mxml: " + usedNames.toString());
}
usedNames.addAll(asEmitterUsedNames);
Set<String> asStaticEmitterUsedNames = ((JSRoyaleEmitter)asEmitter).staticUsedNames;
removals = new HashSet<String>();
for (String usedName : asStaticEmitterUsedNames) {
//remove any internal component that has been registered with the other emitter's usedNames
if (usedName.startsWith(currentClassName+".") && subDocumentNames.contains(usedName.substring(currentClassName.length()+1))) {
removals.add(usedName);
}
}
for (String usedName : removals)
{
asStaticEmitterUsedNames.remove(usedName);
}
if (fjp.config == null || fjp.config.isVerbose())
{
System.out.println(currentClassName + " as: " + asStaticEmitterUsedNames.toString());
System.out.println(currentClassName + " mxml: " + staticUsedNames.toString());
}
staticUsedNames.addAll(asStaticEmitterUsedNames);
boolean foundXML = false;
String[] lines = output.split("\n");
ArrayList<String> finalLines = new ArrayList<String>();
int endRequires = -1;
boolean sawRequires = false;
boolean stillSearching = true;
int provideIndex = -1;
ArrayList<String> namesToAdd = new ArrayList<String>();
ArrayList<String> foundRequires = new ArrayList<String>();
int len = lines.length;
for (int i = 0; i < len; i++)
{
String line = lines[i];
if (stillSearching)
{
if (provideIndex == -1 || !sawRequires)
{
int c = line.indexOf(JSGoogEmitterTokens.GOOG_PROVIDE.getToken());
if (c != -1)
{
// if zero requires are found, require Language after the
// call to goog.provide
provideIndex = i + 1;
}
}
int c = line.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
if (c > -1)
{
int c2 = line.indexOf(")");
String s = line.substring(c + 14, c2 - 1);
if (s.equals(IASLanguageConstants.XML))
{
foundXML = true;
}
sawRequires = true;
foundRequires.add(s);
if (!usedNames.contains(s))
{
removeLineFromMappings(i);
continue;
}
}
else if (sawRequires)
{
// append info() structure if main CU
ICompilerProject project = getMXMLWalker().getProject();
RoyaleJSProject royaleProject = null;
if (project instanceof RoyaleJSProject)
royaleProject = (RoyaleJSProject) project;
stillSearching = false;
for (String usedName : usedNames) {
if (!foundRequires.contains(usedName)) {
if (usedName.equals(classDefinition.getQualifiedName())) continue;
if (((JSRoyaleEmitter) asEmitter).getModel().isInternalClass(usedName)) continue;
if (subDocumentNames.contains(usedName)) continue;
if (royaleProject != null)
{
if (!isGoogProvided(usedName))
{
continue;
}
ICompilationUnit cu = royaleProject.resolveQNameToCompilationUnit(usedName);
if (cu == null)
{
System.out.println("didn't find CompilationUnit for " + usedName);
}
}
namesToAdd.add(usedName);
}
}
for (String nameToAdd : namesToAdd) {
finalLines.add(createRequireLine(nameToAdd,false));
addLineToMappings(i);
}
endRequires = finalLines.size();
}
}
finalLines.add(line);
}
boolean needXML = ((RoyaleJSProject)(((IMXMLBlockWalker) getMXMLWalker()).getProject())).needXML;
if (needXML && !foundXML)
{
StringBuilder appendString = new StringBuilder();
appendString.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
appendString.append(ASEmitterTokens.PAREN_OPEN.getToken());
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(IASLanguageConstants.XML);
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
appendString.append(ASEmitterTokens.SEMICOLON.getToken());
finalLines.add(endRequires, appendString.toString());
addLineToMappings(endRequires);
endRequires++;
}
// append info() structure if main CU
ICompilerProject project = getMXMLWalker().getProject();
if (project instanceof RoyaleJSProject)
{
RoyaleJSProject royaleProject = (RoyaleJSProject) project;
if (royaleProject.mainCU != null)
{
String mainDef = null;
try {
mainDef = royaleProject.mainCU.getQualifiedNames().get(0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String thisDef = documentDefinition.getQualifiedName();
if (mainDef != null && mainDef.equals(thisDef))
{
String infoInject = "\n\n" + thisDef + ".prototype.info = function() {\n" +
" return { ";
String sep = "";
Set<String> mixins = royaleProject.mixinClassNames;
if (mixins.size() > 0)
{
String mixinInject = "\"mixins\": [";
boolean firstOne = true;
for (String mixin : mixins)
{
if (!isGoogProvided(mixin))
{
continue;
}
if (!firstOne)
{
mixinInject += ", ";
}
mixinInject += mixin;
firstOne = false;
StringBuilder appendString = new StringBuilder();
appendString.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
appendString.append(ASEmitterTokens.PAREN_OPEN.getToken());
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(mixin);
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
appendString.append(ASEmitterTokens.SEMICOLON.getToken());
finalLines.add(endRequires, appendString.toString());
addLineToMappings(endRequires);
endRequires++;
}
mixinInject += "]";
infoInject += mixinInject;
sep = ",\n";
}
Map<String, String> aliases = royaleProject.remoteClassAliasMap;
if (aliases != null && aliases.size() > 0)
{
String aliasInject = sep + "\"remoteClassAliases\": {";
boolean firstOne = true;
for (String className : aliases.keySet())
{
if (!isGoogProvided(className))
{
continue;
}
if (!firstOne)
{
aliasInject += ", ";
}
aliasInject += "\"" + className + "\": ";
String alias = aliases.get(className);
aliasInject += "\"" + alias + "\"";
firstOne = false;
StringBuilder appendString = new StringBuilder();
appendString.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
appendString.append(ASEmitterTokens.PAREN_OPEN.getToken());
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(className);
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
appendString.append(ASEmitterTokens.SEMICOLON.getToken());
finalLines.add(endRequires, appendString.toString());
addLineToMappings(endRequires);
endRequires++;
}
aliasInject += "}";
infoInject += aliasInject;
sep = ",\n";
}
Collection<String> locales = royaleProject.getLocales();
if (locales.size() > 0)
{
String localeInject = sep + "\"compiledLocales\": [";
boolean firstOne = true;
String[] localeNames = new String[locales.size()];
locales.toArray(localeNames);
for (String locale : localeNames)
{
if (!firstOne)
{
localeInject += ", ";
}
localeInject += "\"" + locale + "\"";
firstOne = false;
}
localeInject += "]";
infoInject += localeInject;
sep = ",\n";
}
List<String> bundles = royaleProject.compiledResourceBundleNames;
if (bundles.size() > 0)
{
String bundleInject = sep + "\"compiledResourceBundleNames\": [";
boolean firstOne = true;
for (String bundle : bundles)
{
if (!firstOne)
{
bundleInject += ", ";
}
bundleInject += "\"" + bundle + "\"";
firstOne = false;
}
bundleInject += "]";
infoInject += bundleInject;
sep = ",\n";
}
List<String> bundleClasses = royaleProject.compiledResourceBundleClasses;
if (bundles.size() > 0)
{
for (String bundleClass : bundleClasses)
{
StringBuilder appendString = new StringBuilder();
appendString.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
appendString.append(ASEmitterTokens.PAREN_OPEN.getToken());
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(bundleClass);
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
appendString.append(ASEmitterTokens.SEMICOLON.getToken());
finalLines.add(endRequires, appendString.toString());
addLineToMappings(endRequires);
endRequires++;
}
}
boolean isMX = false;
List<ISWC> swcs = royaleProject.getLibraries();
for (ISWC swc : swcs)
{
if (swc.getSWCFile().getName().equalsIgnoreCase("MX.swc"))
{
isMX = true;
break;
}
}
if (isMX)
{
MXMLDocumentNode mxmlDoc = (MXMLDocumentNode)documentDefinition.getNode();
if (mxmlDoc != null)
{
MXMLFileNode mxmlFile = (MXMLFileNode)mxmlDoc.getParent();
if (mxmlFile != null)
{
ITargetAttributes attrs = mxmlFile.getTargetAttributes(royaleProject);
if (attrs != null && attrs.getUsePreloader() != null)
{
String preloaderInject = sep + IMXMLLanguageConstants.ATTRIBUTE_USE_PRELOADER + ": ";
preloaderInject += attrs.getUsePreloader() == Boolean.TRUE ? "true" : "false";
sep = ",\n";
infoInject += preloaderInject;
}
}
}
}
String contextRoot = royaleProject.getServciesContextRoot();
if (contextRoot != null)
{
String contextInject = sep + "\"contextRoot\"" + ": ";
contextInject += "'" + contextRoot.trim() + "'";
sep = ",\n";
infoInject += contextInject;
}
String servicesPath = royaleProject.getServicesXMLPath();
if (servicesPath != null)
{
File servicesFile = new File(servicesPath);
if (!servicesFile.exists())
{
FileNotFoundProblem prob = new FileNotFoundProblem(servicesPath);
royaleProject.getProblems().add(prob);
}
else
{
// should use XML parser to skip over comments
// but this will work for now
List<String> fileLines = null;
try {
fileLines = Files.readLines(new File(servicesPath), Charset.forName("utf8"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StringBuffer sb = new StringBuffer();
boolean inComment = false;
boolean inChannels = false;
for (String s : fileLines)
{
s = s.trim();
if (s.contains("<!--"))
{
if (!s.contains("-->"))
inComment = true;
continue;
}
if (inComment)
{
if (s.contains("-->"))
inComment = false;
continue;
}
if (s.contains("service-include"))
{
int c = s.indexOf("file-path");
c = s.indexOf("\"", c);
int c2 = s.indexOf("\"", c + 1);
String filePath = s.substring(c + 1, c2);
File subFile = new File(servicesFile.getParentFile(), filePath);
List<String> subfileLines;
try {
subfileLines = Files.readLines(subFile, Charset.forName("utf8"));
s = getSubFileContent(subfileLines);
sb.append(s);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
sb.append(s + " ");
if (s.contains("<channel-definition"))
inChannels = true;
if (s.contains("<endpoint"))
inChannels = false;
if (inChannels && s.contains("class"))
{
int c = s.indexOf("class");
c = s.indexOf("\"", c);
int c2 = s.indexOf("\"", c + 1);
String className = s.substring(c + 1, c2);
StringBuilder appendString = new StringBuilder();
appendString.append(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
appendString.append(ASEmitterTokens.PAREN_OPEN.getToken());
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(className);
appendString.append(ASEmitterTokens.SINGLE_QUOTE.getToken());
appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
appendString.append(ASEmitterTokens.SEMICOLON.getToken());
finalLines.add(endRequires, appendString.toString());
addLineToMappings(endRequires);
endRequires++;
}
}
}
String servicesInject = sep + "\"servicesConfig\"" + ": ";
servicesInject += "'" + sb.toString().trim() + "'";
sep = ",\n";
infoInject += servicesInject;
}
}
infoInject += "}};";
finalLines.add(infoInject);
int newLineIndex = 0;
while((newLineIndex = infoInject.indexOf('\n', newLineIndex)) != -1)
{
addLineToMappings(finalLines.size());
newLineIndex++;
}
String cssInject = "\n\n" + thisDef + ".prototype.cssData = [";
JSCSSCompilationSession cssSession = (JSCSSCompilationSession) royaleProject.getCSSCompilationSession();
String s = cssSession.getEncodedCSS();
if (s != null)
{
int reqidx = s.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
if (reqidx != -1)
{
String cssRequires = s.substring(reqidx);
s = s.substring(0, reqidx - 1);
String[] cssRequireLines = cssRequires.split("\n");
for(String require : cssRequireLines)
{
finalLines.add(endRequires, require);
addLineToMappings(endRequires);
endRequires++;
}
}
cssInject += s;
finalLines.add(cssInject);
newLineIndex = 0;
while((newLineIndex = cssInject.indexOf('\n', newLineIndex)) != -1)
{
addLineToMappings(finalLines.size());
newLineIndex++;
}
}
}
}
}
if (staticUsedNames.size() > 0)
{
if (staticUsedNames.size() > 1 || !staticUsedNames.contains(currentClassName))
{
StringBuilder sb = new StringBuilder();
sb.append(JSGoogEmitterTokens.ROYALE_STATIC_DEPENDENCY_LIST.getToken());
boolean firstDependency = true;
for (String staticName : staticUsedNames)
{
if (currentClassName.equals(staticName))
continue;
if (!firstDependency)
sb.append(",");
firstDependency = false;
sb.append(staticName);
}
sb.append("*/");
finalLines.add(provideIndex, sb.toString());
addLineToMappings(provideIndex);
}
}
return Joiner.on("\n").join(finalLines);
}