You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ms...@apache.org on 2013/01/21 21:48:36 UTC
svn commit: r1436611 - in /flex/falcon/trunk:
compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/
compiler.jx/src/org/apache/flex/compiler/as/codegen/
compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/
compiler.jx/src/org/apa...
Author: mschmalle
Date: Mon Jan 21 20:48:36 2013
New Revision: 1436611
URL: http://svn.apache.org/viewvc?rev=1436611&view=rev
Log:
Flex:FalconJx
- added ImportNode to visitor and walker API
- added test, needs to be implemented later
- fixed goog producing functions in MXML document
Modified:
flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestPackage.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java
Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestPackage.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestPackage.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestPackage.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestPackage.java Mon Jan 21 20:48:36 2013
@@ -20,6 +20,7 @@
package org.apache.flex.compiler.internal.as.codegen;
import org.apache.flex.compiler.tree.as.IFileNode;
+import org.junit.Ignore;
import org.junit.Test;
/**
@@ -82,4 +83,14 @@ public class TestPackage extends TestWal
assertOut("package foo.bar.baz {\n\tpublic class A {\n\t\tpublic function A() {\n\t\t\t"
+ "if (a) {\n\t\t\t\tfor each (var i:Object in obj) {\n\t\t\t\t\tdoit();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}");
}
+
+ @Ignore
+ @Test
+ public void testPackage_Import()
+ {
+ // TODO (mschmalle) implement Import unit tests for as
+ IFileNode node = getFileNode("package{import foo.bar.Baz;}");
+ visitor.visitFile(node);
+ assertOut("package {\nimport foo.bar.Baz;}");
+ }
}
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java Mon Jan 21 20:48:36 2013
@@ -39,6 +39,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IGetterNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.IIfNode;
+import org.apache.flex.compiler.tree.as.IImportNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IIterationFlowNode;
import org.apache.flex.compiler.tree.as.IKeywordNode;
@@ -103,6 +104,8 @@ public interface IASEmitter
*/
void writeNewline();
+ void emitImport(IImportNode node);
+
void emitPackageHeader(IPackageDefinition definition);
void emitPackageHeaderContents(IPackageDefinition definition);
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java Mon Jan 21 20:48:36 2013
@@ -53,6 +53,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IGetterNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.IIfNode;
+import org.apache.flex.compiler.tree.as.IImportNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IIterationFlowNode;
import org.apache.flex.compiler.tree.as.IKeywordNode;
@@ -94,13 +95,13 @@ import org.apache.flex.compiler.visitor.
public class ASBlockWalker implements IASBlockVisitor, IASBlockWalker
{
private IASEmitter emitter;
-
+
@Override
public IASEmitter getEmitter()
{
return emitter;
}
-
+
private final List<ICompilerProblem> errors;
List<ICompilerProblem> getErrors()
@@ -191,7 +192,8 @@ public class ASBlockWalker implements IA
public void visitPackage(IPackageNode node)
{
debug("visitPackage()");
- IPackageDefinition definition = (IPackageDefinition) node.getDefinition();
+ IPackageDefinition definition = (IPackageDefinition) node
+ .getDefinition();
emitter.emitPackageHeader(definition);
emitter.emitPackageHeaderContents(definition);
emitter.emitPackageContents(definition);
@@ -498,6 +500,13 @@ public class ASBlockWalker implements IA
}
@Override
+ public void visitImport(IImportNode node)
+ {
+ debug("visitImport()");
+ emitter.emitImport(node);
+ }
+
+ @Override
public void visitMetaTags(IMetaTagsNode node)
{
debug("visitMetaTags()");
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java Mon Jan 21 20:48:36 2013
@@ -27,6 +27,7 @@ import java.util.List;
import org.apache.flex.compiler.as.codegen.IASEmitter;
import org.apache.flex.compiler.as.codegen.IDocEmitter;
import org.apache.flex.compiler.common.ASModifier;
+import org.apache.flex.compiler.common.IImportTarget;
import org.apache.flex.compiler.common.ModifiersSet;
import org.apache.flex.compiler.constants.IASKeywordConstants;
import org.apache.flex.compiler.constants.IASLanguageConstants;
@@ -59,6 +60,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IGetterNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.IIfNode;
+import org.apache.flex.compiler.tree.as.IImportNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IIterationFlowNode;
import org.apache.flex.compiler.tree.as.IKeywordNode;
@@ -226,6 +228,15 @@ public class ASEmitter implements IASEmi
//--------------------------------------------------------------------------
@Override
+ public void emitImport(IImportNode node)
+ {
+ IImportTarget target = node.getImportTarget();
+ write("import");
+ write(SPACE);
+ write(target.toString());
+ }
+
+ @Override
public void emitPackageHeader(IPackageDefinition definition)
{
writeToken(IASKeywordConstants.PACKAGE);
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/visitor/ASNodeSwitch.java Mon Jan 21 20:48:36 2013
@@ -38,6 +38,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IGetterNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.IIfNode;
+import org.apache.flex.compiler.tree.as.IImportNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IIterationFlowNode;
import org.apache.flex.compiler.tree.as.IKeywordNode;
@@ -288,7 +289,11 @@ public class ASNodeSwitch implements IAS
{
visitor.visitMetaTag((IMetaTagNode) node);
}
-
+ else if (node instanceof IImportNode)
+ {
+ visitor.visitImport((IImportNode) node);
+ }
+
else if (node instanceof IExpressionNode)
{
visitor.visitExpression((IExpressionNode) node);
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java Mon Jan 21 20:48:36 2013
@@ -20,13 +20,16 @@
package org.apache.flex.compiler.internal.js.codegen.goog;
import org.apache.flex.compiler.common.ASModifier;
+import org.apache.flex.compiler.common.DependencyType;
import org.apache.flex.compiler.constants.IASKeywordConstants;
import org.apache.flex.compiler.constants.IASLanguageConstants;
import org.apache.flex.compiler.definitions.IClassDefinition;
import org.apache.flex.compiler.definitions.ITypeDefinition;
+import org.apache.flex.compiler.definitions.references.IReference;
import org.apache.flex.compiler.internal.as.codegen.ASEmitter;
import org.apache.flex.compiler.internal.js.codegen.JSDocEmitter;
import org.apache.flex.compiler.internal.js.codegen.JSSharedData;
+import org.apache.flex.compiler.internal.scopes.ASScope;
import org.apache.flex.compiler.internal.semantics.SemanticUtils;
import org.apache.flex.compiler.js.codegen.IJSEmitter;
import org.apache.flex.compiler.js.codegen.goog.IJSGoogDocEmitter;
@@ -39,7 +42,9 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IPackageNode;
import org.apache.flex.compiler.tree.as.IParameterNode;
+import org.apache.flex.compiler.tree.as.IScopedNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.apache.flex.compiler.tree.mxml.IMXMLDocumentNode;
public class JSGoogDocEmitter extends JSDocEmitter implements IJSGoogDocEmitter
{
@@ -52,51 +57,50 @@ public class JSGoogDocEmitter extends JS
{
super(emitter);
}
-
+
@Override
public void emitInterfaceDoc(IInterfaceNode node)
{
begin();
-
- emitJSDocLine(JSGoogEmitter.INTERFACE);
-
+
+ emitJSDocLine(JSGoogEmitter.INTERFACE);
+
String[] inodes = node.getExtendedInterfaces();
for (String inode : inodes)
{
emitJSDocLine(IASKeywordConstants.EXTENDS, inode);
}
-
+
end();
}
-
+
@Override
public void emitFieldDoc(IVariableNode node)
{
- begin();
-
- String ns = node.getNamespace();
- if (ns == IASKeywordConstants.PRIVATE)
- {
- emitPrivate(node);
- }
- else if (ns == IASKeywordConstants.PROTECTED)
- {
- emitProtected(node);
- }
-
- if (node.isConst())
- emitConst(node);
-
- emitType(node);
-
- end();
+ begin();
+
+ String ns = node.getNamespace();
+ if (ns == IASKeywordConstants.PRIVATE)
+ {
+ emitPrivate(node);
+ }
+ else if (ns == IASKeywordConstants.PROTECTED)
+ {
+ emitProtected(node);
+ }
+
+ if (node.isConst())
+ emitConst(node);
+
+ emitType(node);
+
+ end();
}
-
+
@Override
public void emitMethodDoc(IFunctionNode node, ICompilerProject project)
{
- IClassNode cnode = (IClassNode) node.getAncestorOfType(IClassNode.class);
- IClassDefinition classDefinition = cnode.getDefinition();
+ IClassDefinition classDefinition = resolveClassDefinition(node);
if (node instanceof IFunctionNode)
{
@@ -106,24 +110,35 @@ public class JSGoogDocEmitter extends JS
{
begin();
hasDoc = true;
-
+
emitJSDocLine(JSGoogEmitter.CONSTRUCTOR);
-
- IClassDefinition parent = (IClassDefinition) node.getDefinition().getParent();
+
+ IClassDefinition parent = (IClassDefinition) node
+ .getDefinition().getParent();
IClassDefinition superClass = parent.resolveBaseClass(project);
- String qname = superClass.getQualifiedName();
-
- if (superClass != null && !qname.equals(IASLanguageConstants.Object))
+ String qname = superClass.getQualifiedName();
+
+ if (superClass != null
+ && !qname.equals(IASLanguageConstants.Object))
emitExtends(superClass);
-
- IExpressionNode[] inodes = cnode.getImplementedInterfaceNodes();
- if (inodes.length > 0)
+
+ IReference[] references = classDefinition
+ .getImplementedInterfaceReferences();
+ for (IReference iReference : references)
{
- for (IExpressionNode inode : inodes)
- {
- emitImplements(inode.resolveType(project));
- }
+ emitImplements((ITypeDefinition) iReference.resolve(
+ project, (ASScope) classDefinition.getContainingScope(),
+ DependencyType.INHERITANCE, true));
}
+
+ // IExpressionNode[] inodes = cnode.getImplementedInterfaceNodes();
+ // if (inodes.length > 0)
+ // {
+ // for (IExpressionNode inode : inodes)
+ // {
+ // emitImplements(inode.resolveType(project));
+ // }
+ // }
}
else
{
@@ -151,7 +166,9 @@ public class JSGoogDocEmitter extends JS
// @return
String returnType = node.getReturnType();
- if (returnType != "" && returnType != ASTNodeID.LiteralVoidID.getParaphrase())
+ if (returnType != ""
+ && returnType != ASTNodeID.LiteralVoidID
+ .getParaphrase())
{
if (!hasDoc)
{
@@ -175,7 +192,7 @@ public class JSGoogDocEmitter extends JS
emitOverride(node);
}
}
-
+
if (hasDoc)
end();
}
@@ -185,19 +202,19 @@ public class JSGoogDocEmitter extends JS
public void emitVarDoc(IVariableNode node)
{
if (!node.isConst())
- {
- emitTypeShort(node);
+ {
+ emitTypeShort(node);
}
else
{
- writeNewline();
- begin();
- emitConst(node);
- emitType(node);
- end();
+ writeNewline();
+ begin();
+ emitConst(node);
+ emitType(node);
+ end();
}
}
-
+
@Override
public void emitConst(IVariableNode node)
{
@@ -228,13 +245,15 @@ public class JSGoogDocEmitter extends JS
@Override
public void emitExtends(IClassDefinition superDefinition)
{
- emitJSDocLine(IASKeywordConstants.EXTENDS, superDefinition.getQualifiedName());
+ emitJSDocLine(IASKeywordConstants.EXTENDS,
+ superDefinition.getQualifiedName());
}
@Override
public void emitImplements(ITypeDefinition definition)
{
- emitJSDocLine(IASKeywordConstants.IMPLEMENTS, definition.getQualifiedName());
+ emitJSDocLine(IASKeywordConstants.IMPLEMENTS,
+ definition.getQualifiedName());
}
@Override
@@ -260,14 +279,15 @@ public class JSGoogDocEmitter extends JS
@Override
public void emitParam(IParameterNode node)
{
- String postfix = (node.getDefaultValue() == null) ? "" : ASEmitter.EQUALS;
-
- String paramType = "";
- if (node.isRest())
- paramType = IASLanguageConstants.REST;
- else
- paramType = convertASTypeToJS(node.getVariableType());
-
+ String postfix = (node.getDefaultValue() == null) ? ""
+ : ASEmitter.EQUALS;
+
+ String paramType = "";
+ if (node.isRest())
+ paramType = IASLanguageConstants.REST;
+ else
+ paramType = convertASTypeToJS(node.getVariableType());
+
emitJSDocLine(PARAM, paramType + postfix, node.getName());
}
@@ -308,12 +328,12 @@ public class JSGoogDocEmitter extends JS
public void emitTypeShort(IASNode node)
{
- String type = ((IVariableNode) node).getVariableType();
+ String type = ((IVariableNode) node).getVariableType();
write(JSDOC_OPEN);
writeSpace();
write(AT);
write(TYPE);
- writeSpace();
+ writeSpace();
writeBlockOpen();
write(convertASTypeToJS(type));
writeBlockClose();
@@ -345,14 +365,14 @@ public class JSGoogDocEmitter extends JS
private void emitJSDocLine(String name)
{
- emitJSDocLine(name, "");
+ emitJSDocLine(name, "");
}
-
+
private void emitJSDocLine(String name, String type)
{
- emitJSDocLine(name, type, "");
+ emitJSDocLine(name, type, "");
}
-
+
private void emitJSDocLine(String name, String type, String param)
{
writeSpace();
@@ -361,20 +381,20 @@ public class JSGoogDocEmitter extends JS
write(AT);
write(name);
if (type != "")
- {
- writeSpace();
- writeBlockOpen();
- write(type);
- writeBlockClose();
- }
+ {
+ writeSpace();
+ writeBlockOpen();
+ write(type);
+ writeBlockClose();
+ }
if (param != "")
- {
- writeSpace();
- write(param);
- }
+ {
+ writeSpace();
+ write(param);
+ }
writeNewline();
}
-
+
private boolean containsThisReference(IASNode node)
{
final int len = node.getChildCount();
@@ -397,21 +417,32 @@ public class JSGoogDocEmitter extends JS
private String convertASTypeToJS(String name)
{
- String result = name;
-
- if (name.equals(""))
- result = IASLanguageConstants.ANY_TYPE;
- else if (name.equals(IASLanguageConstants.Boolean) ||
- name.equals(IASLanguageConstants.String) ||
- name.equals(IASLanguageConstants.Number))
- result = result.toLowerCase();
- else if (name.equals(IASLanguageConstants._int) ||
- name.equals(IASLanguageConstants.uint))
- result = IASLanguageConstants.Number.toLowerCase();
-
- result = result.replace(IASLanguageConstants.String, IASLanguageConstants.String.toLowerCase());
-
+ String result = name;
+
+ if (name.equals(""))
+ result = IASLanguageConstants.ANY_TYPE;
+ else if (name.equals(IASLanguageConstants.Boolean)
+ || name.equals(IASLanguageConstants.String)
+ || name.equals(IASLanguageConstants.Number))
+ result = result.toLowerCase();
+ else if (name.equals(IASLanguageConstants._int)
+ || name.equals(IASLanguageConstants.uint))
+ result = IASLanguageConstants.Number.toLowerCase();
+
+ result = result.replace(IASLanguageConstants.String,
+ IASLanguageConstants.String.toLowerCase());
+
return result;
}
+ private IClassDefinition resolveClassDefinition(IFunctionNode node)
+ {
+ IScopedNode scope = node.getContainingScope();
+ if (scope instanceof IMXMLDocumentNode)
+ return ((IMXMLDocumentNode) scope).getClassDefinition();
+
+ IClassNode cnode = (IClassNode) node
+ .getAncestorOfType(IClassNode.class);
+ return cnode.getDefinition();
+ }
}
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java Mon Jan 21 20:48:36 2013
@@ -22,7 +22,6 @@ package org.apache.flex.compiler.interna
import java.io.FilterWriter;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -68,8 +67,6 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
-import com.google.common.collect.Collections2;
-
/**
* Concrete implementation of the 'goog' JavaScript production.
*
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java?rev=1436611&r1=1436610&r2=1436611&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/visitor/IASBlockVisitor.java Mon Jan 21 20:48:36 2013
@@ -39,6 +39,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IGetterNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.IIfNode;
+import org.apache.flex.compiler.tree.as.IImportNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IIterationFlowNode;
import org.apache.flex.compiler.tree.as.IKeywordNode;
@@ -204,6 +205,8 @@ public interface IASBlockVisitor
// Various nodes
//--------------------------------------------------------------------------
+ void visitImport(IImportNode node);
+
void visitMetaTags(IMetaTagsNode node);
void visitMetaTag(IMetaTagNode node);