blob: c0f72aff41dc7934d2e20ac787009e0d13cf47f2 [file] [log] [blame]
/*
*
* 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.
*
*/
package org.apache.royale.compiler.internal.codegen.js.amd;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.royale.compiler.definitions.ITypeDefinition;
/**
* @author Michael Schmalle
*/
public class ExportWriter
{
private static final String CLASSES_TYPES = "__CLASSES$TYPES__";
private static final String CLASSES_STRINGS = "__CLASSES$STRINGS__";
private static final String RUNTIME_TYPES = "__RUNTIME$TYPES__";
private static final String RUNTIME_STRINGS = "__RUNTIME$STRINGS__";
private final JSAMDEmitter emitter;
private List<Dependency> runtime = new ArrayList<Dependency>();
private List<Dependency> types = new ArrayList<Dependency>();
public ExportWriter(JSAMDEmitter emitter)
{
this.emitter = emitter;
}
public void queueExports(ITypeDefinition type, boolean outputString)
{
if (outputString)
{
emitter.write("[");
emitter.write("\"exports\"");
}
emitter.write(", ");
if (outputString)
emitter.write(RUNTIME_STRINGS);
else
emitter.write(RUNTIME_TYPES);
//emitter.write(", ");
if (outputString)
emitter.write(CLASSES_STRINGS);
else
emitter.write(CLASSES_TYPES);
if (outputString)
{
emitter.write("]");
}
}
public void writeExports(ITypeDefinition type, boolean outputString)
{
StringBuilder sb = new StringBuilder();
int i = 0;
int len = runtime.size();
for (Dependency dependency : runtime)
{
sb.append(dependency.output(outputString, "runtime", outputString));
if (i < len - 1)
sb.append(", ");
i++;
}
if (outputString)
{
int start = emitter.builder().indexOf(RUNTIME_STRINGS);
int end = start + RUNTIME_STRINGS.length();
emitter.builder().replace(start, end, sb.toString());
}
else
{
int start = emitter.builder().indexOf(RUNTIME_TYPES);
int end = start + RUNTIME_TYPES.length();
emitter.builder().replace(start, end, sb.toString());
}
sb = new StringBuilder();
i = 0;
len = types.size();
if (len > 0)
sb.append(", "); // trailing comma
for (Dependency dependency : types)
{
sb.append(dependency.output(outputString, "classes", outputString));
if (i < len - 1)
sb.append(", ");
i++;
}
if (outputString)
{
int start = emitter.builder().indexOf(CLASSES_STRINGS);
int end = start + CLASSES_STRINGS.length();
emitter.builder().replace(start, end, sb.toString());
}
else
{
int start = emitter.builder().indexOf(CLASSES_TYPES);
int end = start + CLASSES_TYPES.length();
emitter.builder().replace(start, end, sb.toString());
}
}
void addImports(ITypeDefinition type)
{
Collection<String> imports = new ArrayList<String>();
type.getContainedScope().getScopeNode().getAllImports(imports);
for (String imp : imports)
{
String name = toBaseName(imp);
if (!isExcludedImport(imp))
addDependency(name, imp, false, false);
}
}
void addFrameworkDependencies()
{
runtime.add(new Dependency("AS3", "AS3", false, false));
}
protected boolean isExcludedImport(String imp)
{
return imp.startsWith("__AS3__");
}
public void addDependency(String baseName, String qualifiedName,
boolean isNative, boolean isPlugin)
{
types.add(new Dependency(baseName, qualifiedName, isNative, isPlugin));
}
static String toBaseName(String name)
{
if (!name.contains("."))
return name;
final String basename = name.substring(name.lastIndexOf(".") + 1);
return basename;
}
static class Dependency
{
private final String baseName;
private final String qualifiedName;
public String getQualifiedName()
{
return qualifiedName;
}
private final boolean isNative;
public boolean isNative()
{
return isNative;
}
@SuppressWarnings("unused")
private final boolean isPlugin;
public Dependency(String baseName, String qualifiedName,
boolean isNative, boolean isPlugin)
{
this.baseName = baseName;
this.qualifiedName = qualifiedName;
this.isNative = isNative;
this.isPlugin = isPlugin;
}
@Override
public String toString()
{
return qualifiedName; // TODO (mschmalle|AMD) native
}
public String output(boolean outputString, String base,
boolean qualified)
{
StringBuilder sb = new StringBuilder();
if (outputString)
{
sb.append("\"" + base + "/"
+ qualifiedName.replaceAll("\\.", "/") + "\"");
}
else
{
if (qualified)
sb.append(qualifiedName);
else
sb.append(baseName);
}
return sb.toString();
}
}
}