blob: 8a1dbaba04cea0fe9debe37f35c1ebf9ca540c04 [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.mxml;
import java.util.List;
import org.apache.royale.compiler.codegen.as.IASEmitter;
import org.apache.royale.compiler.codegen.mxml.IMXMLEmitter;
import org.apache.royale.compiler.problems.ICompilerProblem;
import org.apache.royale.compiler.problems.InternalCompilerProblem2;
import org.apache.royale.compiler.projects.IASProject;
import org.apache.royale.compiler.tree.as.IASNode;
import org.apache.royale.compiler.tree.as.IFileNode;
import org.apache.royale.compiler.tree.mxml.IMXMLArrayNode;
import org.apache.royale.compiler.tree.mxml.IMXMLBindingNode;
import org.apache.royale.compiler.tree.mxml.IMXMLBooleanNode;
import org.apache.royale.compiler.tree.mxml.IMXMLClassDefinitionNode;
import org.apache.royale.compiler.tree.mxml.IMXMLComponentNode;
import org.apache.royale.compiler.tree.mxml.IMXMLDataBindingNode;
import org.apache.royale.compiler.tree.mxml.IMXMLDeclarationsNode;
import org.apache.royale.compiler.tree.mxml.IMXMLDeferredInstanceNode;
import org.apache.royale.compiler.tree.mxml.IMXMLDocumentNode;
import org.apache.royale.compiler.tree.mxml.IMXMLEmbedNode;
import org.apache.royale.compiler.tree.mxml.IMXMLEventSpecifierNode;
import org.apache.royale.compiler.tree.mxml.IMXMLFactoryNode;
import org.apache.royale.compiler.tree.mxml.IMXMLFileNode;
import org.apache.royale.compiler.tree.mxml.IMXMLImplementsNode;
import org.apache.royale.compiler.tree.mxml.IMXMLInstanceNode;
import org.apache.royale.compiler.tree.mxml.IMXMLIntNode;
import org.apache.royale.compiler.tree.mxml.IMXMLLiteralNode;
import org.apache.royale.compiler.tree.mxml.IMXMLMetadataNode;
import org.apache.royale.compiler.tree.mxml.IMXMLNode;
import org.apache.royale.compiler.tree.mxml.IMXMLNumberNode;
import org.apache.royale.compiler.tree.mxml.IMXMLObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLPropertySpecifierNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectMethodNode;
import org.apache.royale.compiler.tree.mxml.IMXMLRemoteObjectNode;
import org.apache.royale.compiler.tree.mxml.IMXMLScriptNode;
import org.apache.royale.compiler.tree.mxml.IMXMLStringNode;
import org.apache.royale.compiler.tree.mxml.IMXMLStyleNode;
import org.apache.royale.compiler.tree.mxml.IMXMLStyleSpecifierNode;
import org.apache.royale.compiler.tree.mxml.IMXMLUintNode;
import org.apache.royale.compiler.tree.mxml.IMXMLVectorNode;
import org.apache.royale.compiler.units.ICompilationUnit;
import org.apache.royale.compiler.visitor.IASNodeStrategy;
import org.apache.royale.compiler.visitor.IBlockWalker;
import org.apache.royale.compiler.visitor.mxml.IMXMLBlockVisitor;
import org.apache.royale.compiler.visitor.mxml.IMXMLBlockWalker;
/**
* @author Michael Schmalle
* @author Erik de Bruin
*/
public class MXMLBlockWalker implements IMXMLBlockVisitor, IMXMLBlockWalker
{
//----------------------------------
// emitter
//----------------------------------
private IASEmitter asEmitter;
@Override
public IASEmitter getASEmitter()
{
return asEmitter;
}
private IMXMLEmitter mxmlEmitter;
@Override
public IMXMLEmitter getMXMLEmitter()
{
return mxmlEmitter;
}
//----------------------------------
// errors
//----------------------------------
protected List<ICompilerProblem> errors;
List<ICompilerProblem> getErrors()
{
return errors;
}
//----------------------------------
// project
//----------------------------------
protected IASProject project;
public IASProject getProject()
{
return project;
}
//----------------------------------
// strategy
//----------------------------------
private IASNodeStrategy mxmlStrategy;
public IASNodeStrategy getMXMLStrategy()
{
return mxmlStrategy;
}
public void setMXMLStrategy(IASNodeStrategy value)
{
mxmlStrategy = value;
}
private IASNodeStrategy asStrategy;
public IASNodeStrategy getASStrategy()
{
return asStrategy;
}
public void setASStrategy(IASNodeStrategy value)
{
asStrategy = value;
}
//----------------------------------
// walk
//----------------------------------
@Override
public void walk(IASNode node)
{
try {
if (node instanceof IMXMLNode)
mxmlStrategy.handle(node);
else
asStrategy.handle(node);
}
catch (Exception e)
{
String sp = String.format("%s line %d column %d", node.getSourcePath(), node.getLine() + 1, node.getColumn());
if (node.getSourcePath() == null)
{
IASNode parent = node.getParent();
sp = String.format("%s line %d column %d", parent.getSourcePath(), parent.getLine() + 1, parent.getColumn());
}
InternalCompilerProblem2 problem = new InternalCompilerProblem2(sp, e, "ASBlockWalker");
errors.add(problem);
}
}
@Override
public void visitCompilationUnit(ICompilationUnit unit)
{
debug("visitMXMLCompilationUnit()");
IFileNode node = null;
try
{
node = (IFileNode) unit.getSyntaxTreeRequest().get().getAST();
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
walk(node);
}
public MXMLBlockWalker(List<ICompilerProblem> errors, IASProject project,
IMXMLEmitter mxmlEmitter, IASEmitter asEmitter,
IBlockWalker asBlockWalker)
{
this.asEmitter = asEmitter;
this.mxmlEmitter = mxmlEmitter;
this.project = project;
this.errors = errors;
asEmitter.setWalker(asBlockWalker);
mxmlEmitter.setMXMLWalker((IBlockWalker) this);
}
@Override
public void visitFile(IMXMLFileNode node)
{
debug("visitFile()");
walk(node.getDocumentNode());
}
@Override
public void visitDeclarations(IMXMLDeclarationsNode node)
{
debug("visitDeclarations()");
mxmlEmitter.emitDeclarations(node);
}
@Override
public void visitDocument(IMXMLDocumentNode node)
{
debug("visitDocument()");
IMXMLFileNode fnode = (IMXMLFileNode) node.getParent();
mxmlEmitter.emitDocumentHeader(fnode);
visitClassDefinition(node);
mxmlEmitter.emitDocumentFooter(fnode);
}
@Override
public void visitClassDefinition(IMXMLClassDefinitionNode node)
{
debug("visitClassDefinition()");
mxmlEmitter.emitClass(node);
}
//--------------------------------------------------------------------------
@Override
public void visitDeferredInstance(IMXMLDeferredInstanceNode node)
{
debug("visitdeferredInstance()");
walk(node.getChild(0));
}
//--------------------------------------------------------------------------
@Override
public void visitEventSpecifier(IMXMLEventSpecifierNode node)
{
debug("visitEventSpecifier()");
mxmlEmitter.emitEventSpecifier(node);
}
@Override
public void visitInstance(IMXMLInstanceNode node)
{
debug("visitInstance()");
mxmlEmitter.emitInstance(node);
}
@Override
public void visitPropertySpecifier(IMXMLPropertySpecifierNode node)
{
debug("visitPropertySpecifier()");
mxmlEmitter.emitPropertySpecifier(node);
}
@Override
public void visitScript(IMXMLScriptNode node)
{
debug("visitScript()");
mxmlEmitter.emitScript(node);
}
@Override
public void visitStyleBlock(IMXMLStyleNode node)
{
// don't do anything. subclasses should.
}
@Override
public void visitStyleSpecifier(IMXMLStyleSpecifierNode node)
{
debug("visitStyleSpecifier()");
mxmlEmitter.emitStyleSpecifier(node);
}
//--------------------------------------------------------------------------
@Override
public void visitArray(IMXMLArrayNode node)
{
debug("visitArray()");
mxmlEmitter.emitArray(node);
}
@Override
public void visitBoolean(IMXMLBooleanNode node)
{
debug("visitBoolean()");
mxmlEmitter.emitBoolean(node);
}
@Override
public void visitInt(IMXMLIntNode node)
{
debug("visitInt()");
mxmlEmitter.emitInt(node);
}
@Override
public void visitNumber(IMXMLNumberNode node)
{
debug("visitNumber()");
mxmlEmitter.emitNumber(node);
}
@Override
public void visitString(IMXMLStringNode node)
{
debug("visitString()");
mxmlEmitter.emitString(node);
}
@Override
public void visitUint(IMXMLUintNode node)
{
debug("visitUint()");
mxmlEmitter.emitUint(node);
}
//--------------------------------------------------------------------------
@Override
public void visitLiteral(IMXMLLiteralNode node)
{
debug("visitLiteral()");
mxmlEmitter.emitLiteral(node);
}
//--------------------------------------------------------------------------
@Override
public void visitFactory(IMXMLFactoryNode node)
{
debug("visitFactory()");
mxmlEmitter.emitFactory(node);
}
//--------------------------------------------------------------------------
@Override
public void visitComponent(IMXMLComponentNode node)
{
debug("visitComponent()");
mxmlEmitter.emitComponent(node);
}
//--------------------------------------------------------------------------
@Override
public void visitMetadata(IMXMLMetadataNode node)
{
debug("visitMetadata()");
mxmlEmitter.emitMetadata(node);
}
//--------------------------------------------------------------------------
@Override
public void visitEmbed(IMXMLEmbedNode node)
{
debug("visitEmbed()");
mxmlEmitter.emitEmbed(node);
}
//--------------------------------------------------------------------------
@Override
public void visitImplements(IMXMLImplementsNode node)
{
debug("visitImplements()");
mxmlEmitter.emitImplements(node);
}
//--------------------------------------------------------------------------
@Override
public void visitVector(IMXMLVectorNode node)
{
debug("visitVector()");
mxmlEmitter.emitVector(node);
}
//--------------------------------------------------------------------------
@Override
public void visitDatabinding(IMXMLDataBindingNode node)
{
debug("visitDatabinding()");
mxmlEmitter.emitDatabinding(node);
}
//--------------------------------------------------------------------------
@Override
public void visitBinding(IMXMLBindingNode node)
{
debug("visitBinding()");
//System.out.println("skipping fx:Binding in " + node.getSourcePath() + ". This node should be encoded in the binding data.");
}
//--------------------------------------------------------------------------
@Override
public void visitObject(IMXMLObjectNode node)
{
debug("visitObject()");
mxmlEmitter.emitObject(node);
}
//--------------------------------------------------------------------------
@Override
public void visitRemoteObjectMethod(IMXMLRemoteObjectMethodNode node)
{
debug("visitRemoteObjectMethod()");
mxmlEmitter.emitRemoteObjectMethod(node);
}
@Override
public void visitRemoteObject(IMXMLRemoteObjectNode node) {
debug("visitRemoteObjectMethod()");
mxmlEmitter.emitRemoteObject(node);
}
//--------------------------------------------------------------------------
protected void debug(String message)
{
//System.out.println(message);
}
}