You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2016/04/13 20:56:01 UTC
[09/51] [partial] git commit: [flex-falcon]
[refs/heads/feature/maven-migration-test] - - Check-In of the migrated
project to make error analysis easier
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSEmitter.java b/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSEmitter.java
deleted file mode 100644
index 367a0cc..0000000
--- a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSEmitter.java
+++ /dev/null
@@ -1,3448 +0,0 @@
-/*
- *
- * 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.flex.compiler.internal.as.codegen;
-
-import static org.apache.flex.abc.ABCConstants.*;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.Vector;
-
-import org.apache.flex.abc.ABCConstants;
-import org.apache.flex.abc.visitors.IABCVisitor;
-import org.apache.flex.abc.visitors.IClassVisitor;
-import org.apache.flex.abc.visitors.IMetadataVisitor;
-import org.apache.flex.abc.visitors.IMethodBodyVisitor;
-import org.apache.flex.abc.visitors.IMethodVisitor;
-import org.apache.flex.abc.visitors.IScriptVisitor;
-import org.apache.flex.abc.visitors.ITraitVisitor;
-import org.apache.flex.abc.visitors.ITraitsVisitor;
-import org.apache.flex.abc.graph.IBasicBlock;
-import org.apache.flex.abc.semantics.ClassInfo;
-import org.apache.flex.abc.semantics.ExceptionInfo;
-import org.apache.flex.abc.semantics.InstanceInfo;
-import org.apache.flex.abc.semantics.Instruction;
-import org.apache.flex.abc.semantics.Label;
-import org.apache.flex.abc.semantics.Metadata;
-import org.apache.flex.abc.semantics.MethodBodyInfo;
-import org.apache.flex.abc.semantics.MethodInfo;
-import org.apache.flex.abc.semantics.Name;
-import org.apache.flex.abc.semantics.Namespace;
-import org.apache.flex.abc.semantics.Nsset;
-import org.apache.flex.abc.semantics.PooledValue;
-import org.apache.flex.abc.semantics.ScriptInfo;
-import org.apache.flex.abc.semantics.Trait;
-import org.apache.flex.abc.semantics.Traits;
-import org.apache.flex.abc.instructionlist.InstructionList;
-import org.apache.flex.compiler.constants.IMetaAttributeConstants;
-import org.apache.flex.compiler.definitions.IClassDefinition;
-import org.apache.flex.compiler.definitions.IDefinition;
-import org.apache.flex.compiler.definitions.INamespaceDefinition;
-import org.apache.flex.compiler.internal.definitions.AmbiguousDefinition;
-import org.apache.flex.compiler.internal.definitions.ClassDefinition;
-import org.apache.flex.compiler.internal.definitions.FunctionDefinition;
-import org.apache.flex.compiler.internal.definitions.PackageDefinition;
-import org.apache.flex.compiler.internal.legacy.ASDefinitionFilter;
-import org.apache.flex.compiler.internal.legacy.ASDefinitionFilter.AccessValue;
-import org.apache.flex.compiler.internal.legacy.ASDefinitionFilter.ClassificationValue;
-import org.apache.flex.compiler.internal.legacy.ASDefinitionFilter.SearchScopeValue;
-import org.apache.flex.compiler.internal.legacy.ASScopeUtils;
-import org.apache.flex.compiler.internal.legacy.MemberedDefinitionUtils;
-import org.apache.flex.compiler.internal.projects.CompilerProject;
-import org.apache.flex.compiler.internal.projects.FlexJSProject;
-import org.apache.flex.compiler.projects.ICompilerProject;
-import org.apache.flex.compiler.scopes.IASScope;
-import org.apache.flex.compiler.tree.as.IImportNode.ImportKind;
-import org.apache.flex.compiler.units.ICompilationUnit;
-import org.apache.flex.abc.ABCEmitter;
-
-/**
- * JSEmitter is used in two different phases. During compilation it acts as a
- * visitor that gets called for each layer in the AST (see Emitter*IVisitor
- * classes). The second phase is triggered by JSCompilationUnit's
- * handleABCBytesRequest() and uses emitCode() for building the JavaScript code
- * (see emit* methods). This implementation is part of FalconJS. For more
- * details on FalconJS see org.apache.flex.compiler.JSDriver.
- */
-@SuppressWarnings("nls")
-public class JSEmitter implements IABCVisitor
-{
- protected JSOutputStream w = new JSOutputStream();
- protected Set<String> m_importNames = new TreeSet<String>();
- protected Set<String> m_useNames = new TreeSet<String>();
-
- protected Vector<EmitterClassVisitor> definedClasses = new Vector<EmitterClassVisitor>();
- private Vector<MethodInfo> methodInfos = new Vector<MethodInfo>();
- private Vector<MethodBodyInfo> methodBodies = new Vector<MethodBodyInfo>();
- private Vector<ScriptInfo> scriptInfos = new Vector<ScriptInfo>();
- protected final Boolean emitExterns = JSSharedData.m_useClosureLib && false; // only set emitExterns to true if you want to generate extern files, i.e. svg.js.
-
- private JSSharedData m_sharedData;
- private EmitterClassVisitor m_currentClassVisitor;
- private String m_methodPrologue = "";
- private String m_methodPostlogue = "";
- private static String EXTERN_PREFIX = "// EXTERN ";
- // private ICompilationUnit.Operation m_buildPhase;
- private IABCVisitor m_visitor = null;
- protected ICompilerProject m_project = null;
- protected JSGenerator m_generator = null;
- private IASScope m_currentScope = null;
- protected Map<MethodInfo, FunctionDefinition> m_methodInfoToDefinition = new HashMap<MethodInfo, FunctionDefinition>();
- protected Map<FunctionDefinition, MethodInfo> m_definitionToMethodInfo = new HashMap<FunctionDefinition, MethodInfo>();
- protected String m_packageName = null;
-
- public JSEmitter(JSSharedData sharedData,
- ICompilationUnit.Operation buildPhase,
- ICompilerProject project,
- JSGenerator generator)
- {
- this.w = new JSOutputStream();
- m_sharedData = sharedData;
- m_currentClassVisitor = null;
- // m_buildPhase = buildPhase;
- m_project = project;
- m_generator = generator;
- }
-
- protected void writeString(String str)
- {
- w.writeString(str);
- }
-
- public void setVisitor(IABCVisitor visitor)
- {
- m_visitor = visitor;
- }
-
- public byte[] emit()
- throws Exception
- {
- // Metadata
- /*
- * for (Metadata md : metadataPool.getValues()) { // name final String
- * name = md.getName(); // items count assert md.getKeys().length ==
- * md.getValues().length; // metadata keys for (final String key :
- * md.getKeys()) { writeString( "// META[" + name + "]: key=" + key +
- * "\n" ); } // metadata values for (final String value :
- * md.getValues()) { writeString( "// META[" + name + "]: value=" +
- * value + "\n" ); } }
- */
- m_currentClassVisitor = null;
-
- // first write out the framework class
- EmitterClassVisitor frameWorkClassVisitor = null;
- for (EmitterClassVisitor clz : this.definedClasses)
- {
- InstanceInfo ii = clz.instanceInfo;
- if (!ii.isInterface() && JSGeneratingReducer.getBasenameFromName(ii.name).equals(JSSharedData.JS_FRAMEWORK_NAME))
- {
- m_currentClassVisitor = clz;
- final IDefinition def = getDefinition(ii.name);
- final String packageName = def.getPackageName();
- if (packageName.isEmpty())
- {
- frameWorkClassVisitor = clz;
- emitClass(clz);
- }
- }
- }
-
- // write out all the other classes
- for (EmitterClassVisitor clz : this.definedClasses)
- {
- if (clz != frameWorkClassVisitor)
- {
- m_currentClassVisitor = clz;
-
- if (clz.instanceInfo.isInterface())
- emitInterface(clz);
- else
- emitClass(clz);
- }
- }
-
- // static initializers?
- /*
- * for (EmitterClassVisitor clz : this.definedClasses) {
- * m_currentClassVisitor = clz;
- * w.writeU30(getMethodId(clz.classInfo.cInit));
- * emitTraits(clz.classTraits); }
- */
-
- m_currentClassVisitor = null;
-
- // write out free floating code: package functions and package variables.
- for (ScriptInfo si : this.scriptInfos)
- {
- emitScriptInfo(si);
- }
-
- return w.toByteArray();
- }
-
- protected MethodBodyInfo findMethodBodyInfo(MethodInfo mi)
- {
- for (int i = 0; i < this.methodBodies.size(); i++)
- {
- MethodBodyInfo mbi = methodBodies.elementAt(i);
- if (mbi.getMethodInfo() == mi)
- return mbi;
- }
-
- // Don't throw, because interfaces don't have MethodBodyInfo:
- // throw new IllegalArgumentException("Unable to find MethodBodyInfo for " + mi);
- return null;
- }
-
- protected String emitParameters(MethodInfo mi) throws Exception
- {
- final FunctionDefinition fdef = this.m_methodInfoToDefinition.get(mi);
- String[] chunk = JSGeneratingReducer.emitParameters(m_project, fdef, mi);
- // String[] chunk = JSGeneratingReducer.emitParameters(mi);
-
- final String a_priori_insns = chunk[0];
- final String code = chunk[1];
-
- writeString(code);
- return a_priori_insns;
- }
-
- protected void emitInstanceTraits(Traits traits, MethodInfo ctor, String packageName, String className, String superClass,
- Boolean isExtern, Boolean isInterface, Boolean isPackageFunction) throws Exception
- {
- // private void emitTraits(Traits traits, Boolean isInstanceTraits, MethodInfo ctor, String packageName, String className, String methodPrefix, String assignmentOp, String separator, String indent ) throws Exception
-
- if (JSSharedData.m_useClosureLib)
- {
- if (isExtern)
- emitTraits(traits, true, isExtern, isInterface, isPackageFunction, ctor, packageName, className, superClass, className + ".prototype.", "=", ";", EXTERN_PREFIX);
- else
- {
- final String fullName = createFullName(packageName, className);
- emitTraits(traits, true, isExtern, isInterface, isPackageFunction, ctor, packageName, className, superClass, fullName + ".prototype.", "=", ";", "");
- }
- }
- else
- emitTraits(traits, true, isExtern, isInterface, isPackageFunction, ctor, packageName, className, superClass, "this.", "", ",", isExtern ? EXTERN_PREFIX : " ");
- }
-
- protected Boolean isExtern(Name name)
- {
- if (name != null)
- {
- final IDefinition def = JSGeneratingReducer.getDefinitionForName(m_project, name);
- if (def == null)
- {
- JSGeneratingReducer.getDefinitionForName(m_project, name);
- throw new IllegalArgumentException("isExtern: can't find definition for name " + name.toString());
- }
-
- if (def.getMetaTagByName(JSSharedData.EXTERN_METATAG) != null)
- return true;
- }
- return false;
- }
-
- /** packageName can be "" */
- protected IDefinition getDefinition(Name name)
- {
- if (name == null)
- return null;
-
- final IDefinition def = JSGeneratingReducer.getDefinitionForNameByScope(m_project, m_project.getScope(), name);
-
- if (def == null)
- {
- throw new IllegalArgumentException("getDefinition: can't find definition for name " + name.toString());
- }
-
- return def;
- }
-
- /** packageName can be "" */
- private ClassDefinition getClassDefinition(String shortClassName, String packageName)
- {
- if (packageName.isEmpty())
- return getClassDefinition(shortClassName);
- else
- return getClassDefinition(packageName + "." + shortClassName);
- }
-
- /** expects className to be fully-qualified if it's in a package */
- private ClassDefinition getClassDefinition(String className)
- {
- IDefinition definitionContext = null;
- ASDefinitionFilter filter = new ASDefinitionFilter(ClassificationValue.CLASSES_AND_INTERFACES, SearchScopeValue.ALL_SCOPES, AccessValue.ALL, definitionContext);
- IDefinition def = ASScopeUtils.findDefinitionByName(m_project.getScope(), m_project, className, filter);
- if (def instanceof ClassDefinition)
- {
- final ClassDefinition classDef = (ClassDefinition)def;
- return classDef;
- }
- return null;
- }
-
- // Symbol support
- private Boolean isSymbolClass(String className)
- {
- final ClassDefinition classDef = getClassDefinition(className);
- if (classDef != null)
- {
- for (String implementedInterface : classDef.getImplementedInterfacesAsDisplayStrings())
- {
- if (implementedInterface.equals(JSSharedData.SYMBOL_INTERFACE_NAME))
- return true;
- }
- }
- return false;
- }
-
- private void emitClassInfo(String packageName, String className, String superClass, Boolean isDynamic, Boolean isFinal)
- {
- final String fullClassNameWithoutDot = createFullName(packageName, className);
- String fullClassName = fullClassNameWithoutDot;
- if (!fullClassName.isEmpty())
- fullClassName += ".";
-
- if (superClass.isEmpty())
- superClass = "Object";
-
- // Namespace support
- final IDefinition def = JSSharedData.instance.getDefinition(fullClassNameWithoutDot);
- if (def != null)
- {
- def.getQualifiedName();
- }
- }
-
- private void emitClassTraits(Traits traits, MethodInfo staticInitMI,
- String packageName, String className, String superClass,
- Boolean isExtern, Boolean isPackageFunction,
- Boolean isDynamicClass, Boolean isFinalClass,
- Boolean emitClassPrologue) throws Exception
- {
- final Boolean isInterface = false;
- writeString("\n\n");
-
- // TODO: generalize
- if (isExtern || packageName.startsWith("goog"))
- return;
-
- if (emitClassPrologue && !className.isEmpty())
- {
- emitClassInfo(packageName, className, superClass, isDynamicClass, isFinalClass);
- }
-
- String fullClassName = createFullName(packageName, className);
- if (!fullClassName.isEmpty())
- fullClassName += ".";
-
- emitTraits(traits, false, isExtern, isInterface, isPackageFunction, staticInitMI, packageName.replaceFirst(JSSharedData.ROOT_NAME, ""), className, superClass, fullClassName, "=", ";", "");
-
- /*
- * if( isExtern ) emitTraits( traits, false, isExtern, staticInitMI,
- * packageName, className, superClass, fullClassName, "=", ";", "" );
- * else emitTraits( traits, false, isExtern, staticInitMI,
- * packageName.replaceFirst( JSSharedData.ROOT_NAME, ""), className,
- * superClass, fullClassName, "=", ";", "" );
- */
- }
-
- private String nameToString(Name name)
- {
- String baseName = JSGeneratingReducer.getBasenameFromName(name);
- if (baseName == null || baseName.isEmpty())
- {
- String packageName = "";
- final Nsset nsset = name.getQualifiers();
- if (nsset != null && nsset.length() > 0)
- {
- packageName = nsset.iterator().next().getName();
- if (!packageName.isEmpty())
- baseName = "{" + packageName + "}::" + baseName;
- }
- }
- else
- {
- final IDefinition def = getDefinition(name);
- if (name != null && !name.isTypeName())
- {
- final String packageName = def.getPackageName();
- if (packageName != null && !packageName.isEmpty())
- {
- final String fullName = "{" + packageName + "}::" + baseName;
- return fullName;
- }
- }
- }
- return baseName;
-
- }
-
- // see Namespace::getKindString
- /*
- * private String getKindString(Namespace ns) { switch(ns.getKind()) { case
- * ABCConstants.CONSTANT_Namespace: return "Ns"; case
- * ABCConstants.CONSTANT_PackageNs: return "PackageNs"; case
- * ABCConstants.CONSTANT_PackageInternalNs: return "PackageInternalNs"; case
- * ABCConstants.CONSTANT_ProtectedNs: return "ProtectedNs"; case
- * ABCConstants.CONSTANT_ExplicitNamespace: return "ExplicitNs"; case
- * ABCConstants.CONSTANT_StaticProtectedNs: return "StaticProtectedNs"; case
- * ABCConstants.CONSTANT_PrivateNs: return "PrivateNs"; } return "UnknownNs"
- * ; }
- */
-
- private String mangleName(String baseName, Namespace ns)
- {
- String name = baseName + "::";
- String nsStr = ns.toString();
-
- // workaround for Falcon bug.
- // ns.toString() is now returning:
- // ProtectedNs:"tests:Test"
- // instead of
- // ProtectedNs:"tests.Test"
- if (ns.getName().contains(":") /*
- * && ns.getKind() !=
- * ABCConstants.CONSTANT_Namespace
- */)
- {
- String tmp = ns.getName();
-
- // support for "use namespace"
- /*
- * final INamespaceDefinition ins =
- * JSSharedData.instance.getNamespace(tmp); if( ins != null ) { tmp
- * = ins.getQualifiedName(); }
- */
- tmp = tmp.replaceAll(":", ".");
-
- // another workaround for a Falcon bug.
- // WRONG: PrivateNs:"ClassPrivateNS:tests:Test"
- // CORRECT: PrivateNs:ClassPrivateNS:"tests:Test"
- if (tmp.startsWith("ClassPrivateNS."))
- tmp = tmp.replace("ClassPrivateNS.", "ClassPrivateNS:");
- nsStr = nsStr.substring(0, nsStr.length() - ns.getName().length() - 2) + tmp;
- }
- nsStr = nsStr.replaceAll("\\\"", "");
-
- Boolean colon = false;
- for (String part : nsStr.split(":"))
- {
- if (colon)
- name += ":";
- else
- colon = true;
- part = part.replaceAll("\\\"", "");
-
- if (part.equals("Ns"))
- name += JSSharedData.CONSTANT_Namespace;
- else if (part.equals("PackageNs"))
- name += JSSharedData.CONSTANT_PackageNs;
- else if (part.equals("PackageInternalNs"))
- name += JSSharedData.CONSTANT_PackageInternalNs;
- else if (part.equals("ProtectedNs"))
- name += JSSharedData.CONSTANT_ProtectedNs;
- else if (part.equals("ExplicitNs"))
- name += JSSharedData.CONSTANT_ExplicitNamespace;
- else if (part.equals("StaticProtectedNs"))
- name += JSSharedData.CONSTANT_StaticProtectedNs;
- else if (part.equals("PrivateNs"))
- name += JSSharedData.CONSTANT_PrivateNs;
- else if (part.equals("ClassPrivateNS"))
- name += JSSharedData.CONSTANT_ClassPrivateNS;
- else
- name += part;
- }
-
- return name;
- }
-
- private void emitNamespaceInfo(EmitterClassVisitor clz,
- String packageName, String className, String superClass) throws Exception
- {
- // check whether this class is tagged with [ClassInfo]
- if (!className.isEmpty())
- {
- final Traits instanceTraits = clz.instanceTraits;
- final String fullName = createFullName(packageName, className);
- boolean comma = false;
- String names = "";
- for (Trait t : instanceTraits)
- {
- final Name name = t.getNameAttr("name");
- final Nsset nsset = name.getQualifiers();
- if (nsset != null && nsset.length() > 0)
- {
- if (comma)
- names += ",\n";
- else
- comma = true;
- for (Namespace ns : nsset)
- {
- names += " \"" + mangleName(name.getBaseName(), ns) + "\" : true";
- }
- }
- }
-
- // add _NAMESPACES member to class
- writeString("\n");
- writeString("/**\n");
- writeString(" * Member: " + fullName + "._NAMESPACES\n");
- writeString(" * @const\n");
- writeString(" * @type {Object}\n");
- writeString(" */\n");
-
- if (names.isEmpty())
- writeString(fullName + "._NAMESPACES = {};\n");
- else
- {
- writeString(fullName + "._NAMESPACES = {\n");
- writeString(names + "\n");
- writeString("}\n");
- }
-
- // add _USES member to class
- names = "";
- comma = false;
- for (String uses : m_useNames)
- {
- final INamespaceDefinition ns = JSSharedData.instance.getNamespaceForQName(uses);
- if (ns != null)
- {
- if (comma)
- names += ",\n";
- else
- comma = true;
- names += (" \"" + ns.getURI().replaceAll(":", ".") + "\" : \"" + uses + "\"");
- }
- }
-
- if (!names.isEmpty())
- {
- writeString("\n");
- writeString("/**\n");
- writeString(" * Member: " + fullName + "._USES\n");
- writeString(" * @const\n");
- writeString(" * @type {Object}\n");
- writeString(" */\n");
-
- writeString(fullName + "._USES = {\n");
- writeString(names + "\n");
- writeString("}\n");
- }
- }
- }
-
- private Boolean needsClassInfo(Traits classTraits)
- {
- for (Trait t : classTraits)
- {
- final Vector<Metadata> metaData = t.getMetadata();
- for (Metadata md : metaData)
- {
- if (md.getName().equals(JSSharedData.GENERATE_CLASSINFO))
- return true;
- }
- }
- return false;
- }
-
- /*
- * tests.Test._CLASSINFO = { name : "", isDynamic : true, isFinal : true,
- * isStatic : true, bases : [], traits : { bases : {}, interfaces : {},
- * constructor : { {type: "", optional:false}, ... }, variables : { name:
- * "", type: "", access: "readwrite", uri: "", metadata: { name : "", value
- * : { {key:"", value:""}, ... } } } accessors : { name: "", type: "",
- * access: "readwrite", declaredBy: "", uri: "", metadata: { name : "",
- * value : { {key:"", value:""}, ... } } }, methods : { name: "",
- * returnType: "", declaredBy: "", parameters: { }, uri: "", metadata: {
- * name : "", value : { {key:"", value:""}, ... } } }, metadata: { name :
- * "", value : { {key:"", value:""}, ... } } } }
- */
- private void emitJSONInfo(EmitterClassVisitor clz,
- String packageName, String className, String superClass) throws Exception
- {
- final Traits classTraits = clz.classTraits;
- // check whether this class is tagged with [ClassInfo]
- if (!className.isEmpty() && needsClassInfo(classTraits))
- {
- final Traits instanceTraits = clz.instanceTraits;
- final String fullName = createFullName(packageName, className);
-
- // add _CLASSINFO member to class
- writeString("\n");
- writeString("/**\n");
- writeString(" * Member: " + fullName + "._CLASSINFO\n");
- writeString(" * @const\n");
- writeString(" * @type {Object}\n");
- writeString(" */\n");
- writeString(fullName + "._CLASSINFO =\n");
- writeString("{\n");
-
- final String indent = " ";
- final String indent2 = " ";
- final String indent3 = " ";
- final String indent4 = " ";
- final String indent5 = " ";
-
- // add name, bases, isDynamic, isFinal, isStatic
- final InstanceInfo iinfo = clz.instanceInfo;
- final Boolean isDynamic = !iinfo.isSealed();
- final Boolean isFinal = iinfo.isFinal();
- final Boolean isStatic = true;
- if (packageName.isEmpty())
- writeString(indent + "name : \"" + className + "\",\n");
- else
- writeString(indent + "name : \"{" + packageName + "}::" + className + "\",\n");
- writeString(indent + "bases : [\"Class\"],\n");
- writeString(indent + "isDynamic : " + (isDynamic ? "true" : "false") + ",\n");
- writeString(indent + "isFinal : " + (isFinal ? "true" : "false") + ",\n");
- writeString(indent + "isStatic : " + (isStatic ? "true" : "false") + ",\n");
-
- // traits
- writeString(indent + "traits:\n");
- writeString(indent + "{\n");
-
- // add traits.bases
- writeString(indent2 + "bases:\n");
- writeString(indent2 + "{\n");
-
- ClassDefinition classDef = getClassDefinition(className, packageName);
-
- IClassDefinition superclassDef = classDef.resolveBaseClass(m_project);
- while (superclassDef != null)
- {
- final String superPackageName = superclassDef.getPackageName();
- if (superPackageName.isEmpty())
- writeString(indent3 + superclassDef.getBaseName() + ": \"" + superclassDef.getBaseName() + "\",\n");
- else
- writeString(indent3 + superclassDef.getBaseName() + ": \"{" + superPackageName + "}::" + superclassDef.getBaseName() + "\",\n");
-
- superclassDef = superclassDef.resolveBaseClass(m_project);
- }
- writeString(indent2 + "},\n");
-
- // add traits.interfaces
- writeString(indent2 + "interfaces:\n");
- writeString(indent2 + "{\n");
- for (Name iname : iinfo.interfaceNames)
- {
- writeString(indent3 + "\"" + nameToString(iname) + "\",\n");
- }
- writeString(indent2 + "},\n");
-
- // add traits.constructor
- writeString(indent2 + "constructor:\n");
- writeString(indent2 + "{\n");
- final MethodInfo ctor = clz.instanceInfo.iInit;
- writeString(getParameterInfo(ctor, indent3));
- writeString(indent2 + "},\n");
-
- // add variables, accessors, methods
- List<String> variables = new ArrayList<String>();
- List<String> methods = new ArrayList<String>();
- Map<String, String> getters = new HashMap<String, String>();
- Map<String, String> setters = new HashMap<String, String>();
-
- for (Trait t : instanceTraits)
- {
- String str = new String();
- final Name name = t.getNameAttr("name");
- String propName = JSGeneratingReducer.getBasenameFromName(name);
- String propType = "";
- switch (t.getKind())
- {
- // traits.variables
- case TRAIT_Var:
- case TRAIT_Const:
- {
- final Boolean isConst = t.getKind() == TRAIT_Const;
- final Name type = t.getNameAttr(Trait.TRAIT_TYPE);
- if (type == null)
- propType = "Object";
- else
- propType = nameToString(type);// JSGeneratingReducer.getBasenameFromName(type);
- str += indent3 + propName + ":\n";
- str += indent3 + "{\n";
- str += indent4 + "name : " + "\"" + propName + "\",\n";
- str += indent4 + "type : " + "\"" + propType + "\",\n";
- str += indent4 + "access : " + "\"" + (isConst ? "readonly" : "readwrite") + "\",\n";
- // str += indent4 + "uri : " + "\"" + ??? + "\"\n";
- // str += getMetaDataInfo( findMetadata(classTraits, propName, t.getKind()), indent4 );
- str += getMetaDataInfo(t.getMetadata(), indent4);
- str += indent3 + "}";
- variables.add(str);
- break;
- }
- // traits.accessors
- case TRAIT_Getter:
- case TRAIT_Setter:
- {
- final String declaredBy = "(unknown)"; // TODO
- final String access = t.getKind() == TRAIT_Getter ? "readonly" : "readwrite";
- str += indent3 + propName + ":\n";
- str += indent3 + "{\n";
- str += indent4 + "name : " + "\"" + propName + "\",\n";
- str += indent4 + "type : " + "\"" + propType + "\",\n";
- str += indent4 + "access : " + "\"" + access + "\",\n";
- str += indent4 + "declaredBy : " + "\"" + declaredBy + "\",\n";
- // str += indent4 + "uri : " + "\"" + ??? + "\"\n";
- // str += getMetaDataInfo( findMetadata(classTraits, propName, t.getKind()), indent4 );
- str += getMetaDataInfo(t.getMetadata(), indent4);
- str += indent3 + "}";
-
- if (t.getKind() == TRAIT_Getter)
- getters.put(propName, str);
- else
- setters.put(propName, str);
- break;
- }
- // traits.methods
- case TRAIT_Method:
- case TRAIT_Function:
- {
- final String declaredBy = "(unknown)"; // TODO
- final MethodInfo mi = (MethodInfo)t.getAttr("method_id");
- str += indent3 + propName + ":\n";
- str += indent3 + "{\n";
- str += indent4 + "name : " + "\"" + propName + "\",\n";
- str += indent4 + "returnType : " + "\"" + nameToString(mi.getReturnType()) + "\",\n";
- str += indent4 + "declaredBy : " + "\"" + declaredBy + "\",\n";
- // str += indent4 + "uri : " + "\"" + ??? + "\"\n";
- str += indent4 + "parameters:\n";
- str += indent4 + "{\n";
- str += getParameterInfo(mi, indent5);
- str += indent4 + "},\n";
- // str += getMetaDataInfo( findMetadata(classTraits, propName, t.getKind()), indent4 );
- str += getMetaDataInfo(t.getMetadata(), indent4);
- str += indent3 + "}";
- methods.add(str);
-
- break;
- }
- }
- }
-
- // add variables
- writeString(indent2 + "variables:\n");
- writeString(indent2 + "{\n");
- for (String var : variables)
- {
- writeString(var + ",\n");
- }
- writeString(indent2 + "},\n");
-
- // add accessors
- writeString(indent2 + "accessors:\n");
- writeString(indent2 + "{\n");
- for (Map.Entry<String, String> entry : getters.entrySet())
- {
- final String s = setters.get(entry.getKey());
- if (s != null)
- writeString(s + ",\n");
- else
- writeString(entry.getValue() + ",\n");
- }
- writeString(indent2 + "},\n");
-
- // add methods
- writeString(indent2 + "methods:\n");
- writeString(indent2 + "{\n");
- for (String met : methods)
- {
- writeString(met + ",\n");
- }
- writeString("\n");
- writeString(indent2 + "},\n");
-
- // closing traits
- writeString(indent + "},\n");
-
- // add class metadata
- for (Trait t : classTraits)
- {
- if (t.getKind() == TRAIT_Class)
- writeString(getMetaDataInfo(t.getMetadata(), indent));
- }
-
- writeString("}\n");
- }
- }
-
- /*
- * private Vector<Metadata> findMetadata( Traits classTraits, String name,
- * int traitKind ) { for( Trait t : classTraits ) { if( t.getKind() ==
- * traitKind ) { final Name n = t.getNameAttr("name"); if(
- * JSGeneratingReducer.getBasenameFromName(n).equals(name) ) return
- * t.getMetadata(); } } return new Vector<Metadata>(); }
- */
-
- private String getMetaDataInfo(Vector<Metadata> metaData, String indent)
- {
- String s = "";
- if (!metaData.isEmpty())
- {
- s += indent + "metadata:\n";
- s += indent + "{\n";
- for (Metadata md : metaData)
- {
- s += indent + " " + md.getName() + ":\n";
- s += indent + " {\n";
- s += indent + " " + "name : \"" + md.getName() + "\",\n";
- final String[] keys = md.getKeys();
- if (keys.length > 0)
- {
- final String[] values = md.getValues();
-
- s += indent + " " + "value:\n";
- s += indent + " " + "{\n";
- for (int i = 0; i < keys.length; ++i)
- {
- s += indent + " " + keys[i] + ": {key: \"" + keys[i] + "\", value: \"" + values[i] + "\"},\n";
- }
- s += indent + " " + "}\n";
- }
- s += indent + " },\n";
- }
- s += indent + "}\n";
- }
- return s;
- }
-
- private String getParameterInfo(MethodInfo mi, String indent)
- {
- String s = "";
- if (mi != null)
- {
- Vector<PooledValue> defaultValues = mi.getDefaultValues();
- Vector<Name> paramTypes = mi.getParamTypes();
- final int defaultsStartAt = paramTypes.size() - defaultValues.size();
- int current = 0;
- for (Name type : paramTypes)
- {
- final String optional = current >= defaultsStartAt ? "true" : "false";
- s += indent + "p" + current + ": {type: \"" + nameToString(type) + "\", optional: " + optional + "},\n";
- current++;
- }
- }
- return s;
- }
-
- /*
- * private void emitPackageNames() { writeString( "// Packages \n" ); // get
- * all package names from the shared data object Set<String> packages =
- * JSSharedData.instance.getPackages(); // "expand" the package names, i.e.
- * "com.adobe" expands to "com", "com.adobe". Set<String> expanded = new
- * TreeSet<String>(); for (String packageName : packages) { String path =
- * ""; String[] parts = packageName.split("\\."); for( String part: parts )
- * { if( path.length() == 0 ) path += part; else path += "." + part; if(
- * path.length() > 0 ) expanded.add( path ); } } // create an entry for each
- * expanded package name Iterator<String> it = expanded.iterator(); if(
- * it.hasNext() ) { while (it.hasNext()) { writeString(
- * JSSharedData.ROOT_NAME + it.next().toString() + " = {};\n" ); } }
- * writeString( "\n" ); }
- */
-
- private String createFullName(String packageName, String className)
- {
- String fullName = "";
-
- // root name
- if (!JSSharedData.ROOT_NAME.isEmpty() && !className.startsWith(JSSharedData.ROOT_NAME))
- fullName += JSSharedData.ROOT_NAME;
-
- // package name
- if (!packageName.isEmpty())
- {
- if (!fullName.isEmpty())
- fullName += ".";
- fullName += packageName;
- }
-
- // class name
- if (!className.isEmpty())
- {
- if (!fullName.isEmpty())
- fullName += ".";
- fullName += className;
- }
-
- return fullName;
- }
-
- /*
- * private int typeNameToAbcConstant( Name typeName ) { if( typeName != null
- * ) { final String type =
- * JSGeneratingReducer.getBasenameFromName(typeName); if( type.equals("int")
- * ) return ABCConstants.CONSTANT_Int; if( type.equals("uint") ) return
- * ABCConstants.CONSTANT_UInt; if( type.equals("Number") ) return
- * ABCConstants.CONSTANT_Double; if( type.equals("String") ) return
- * ABCConstants.CONSTANT_Utf8; if( type.equals("Boolean") ) return
- * ABCConstants.CONSTANT_False; if( type.equals("null") ) return
- * ABCConstants.CONSTANT_Null; } return ABCConstants.CONSTANT_Undefined; }
- */
- private Boolean isDataClassDefinition(IDefinition def)
- {
- if (def != null && def instanceof IClassDefinition)
- {
- IClassDefinition classDef = (IClassDefinition)def;
- Iterator<IClassDefinition> superClassIterator = classDef.classIterator(m_project, true);
-
- while (superClassIterator.hasNext())
- {
- final IClassDefinition superClass = superClassIterator.next();
- if (superClass.getMetaTagByName("DataClass") != null)
- return true;
- }
- }
- return false;
- }
-
- protected void emitCtor(MethodInfo ctor, Boolean isExtern, Boolean isInterface, String packageName, String className, String superClassName,
- String methodPrefix, String assignmentOp, String separator, String indent) throws Exception
- {
- final Boolean isFramework = className.equals(JSSharedData.JS_FRAMEWORK_NAME);
-
- // first check whether there is any code...
- final String body = getCodeForConstructor(ctor);
- final String fullName = createFullName(packageName, className);
-
- if (!body.isEmpty() || JSSharedData.instance.hasClassInit(fullName))
- {
- // writeString("\n" + indent + "// Constructor\n");
-
- m_methodPrologue = "";
-
- final Boolean isPackageFunction = false;
- if (JSSharedData.m_useClosureLib)
- {
- final String pkg = packageName.isEmpty() ? "" : (createFullName(packageName, "") + ".");
- emitMethod(null, ctor, isFramework, isExtern, isInterface, isPackageFunction, fullName, className, "", pkg, assignmentOp, separator, indent);
- }
- else
- {
- MethodBodyInfo mbi = findMethodBodyInfo(ctor);
- emitMethodBody(mbi);
- }
- }
- else
- {
- if (JSSharedData.m_useClosureLib)
- writeString(fullName + " = function(){}\n");
- }
-
- // inherits
- if (JSSharedData.m_useClosureLib && (!JSGeneratingReducer.isDataType(superClassName) || superClassName.equals("Error")))
- {
- writeString("goog.inherits("
- + fullName + ", "
- + superClassName + ");\n");
- }
-
- // don't add _CLASS to DataClass instances.
- final IDefinition def = JSSharedData.instance.getDefinition(fullName);
- if (JSSharedData.m_useClosureLib && (def == null || !isDataClassDefinition(def)))
- {
- // add _CLASS member to instance
- writeString("\n");
- writeString("/**\n");
- writeString(" * Member: " + fullName + ".prototype._CLASS\n");
- writeString(" * @const\n");
- writeString(" * @type {" + fullName + "}\n");
- writeString(" */\n");
- writeString(fullName + ".prototype._CLASS = " + fullName + ";\n");
- }
- }
-
- protected String emitSlotValue(Trait t)
- {
- Object trait_value = t.getAttr(Trait.SLOT_VALUE);
- if (trait_value != null)
- {
- // See also poolTraitValues(Traits), which
- // puts these values into the pools.
- if (trait_value instanceof String)
- {
- return ((String)trait_value);
- }
- else if (trait_value instanceof Namespace)
- {
- return (((Namespace)trait_value).getName());
- }
- else if (trait_value instanceof Double)
- {
- return (((Double)trait_value).toString());
- }
- else if (trait_value instanceof Integer)
- {
- return (((Integer)trait_value).toString());
- }
- else if (trait_value instanceof Long)
- {
- return (((Long)trait_value).toString());
- }
- else if (trait_value instanceof Float)
- {
- return (((Float)trait_value).toString());
- }
- else if (trait_value.equals(Boolean.TRUE))
- {
- return ("true");
- }
- else if (trait_value.equals(Boolean.FALSE))
- {
- return ("false");
- }
- else if (trait_value == ABCConstants.NULL_VALUE)
- {
- return ("null");
- }
- else if (trait_value == ABCConstants.UNDEFINED_VALUE)
- {
- // Undefined is a special case; it has no kind byte.
- return ("undefined");
- }
- else
- {
- throw new IllegalStateException("Unrecognized initializer type: " + trait_value.getClass().toString());
- }
- }
- else
- {
- final Name type = t.getNameAttr(Trait.TRAIT_TYPE);
-
- // In AS, uninitialized variables have a type-specific default value (not always undefined).
- // The local-var version of this fix is in JSGeneratingReducer.reduce_typedVariableDecl()
- return (getDefaultInitializerForVariable(type));
-
- /*
- * // Flash assumes that uninitialized numbers default to "0" and
- * not "undefined". String defaultVal = "undefined"; switch(
- * typeNameToAbcConstant(type) ) { case ABCConstants.CONSTANT_Int :
- * defaultVal = "0"; break; case ABCConstants.CONSTANT_UInt :
- * defaultVal = "0"; break; case ABCConstants.CONSTANT_Double :
- * defaultVal = "0.0"; break; case ABCConstants.CONSTANT_Utf8 :
- * defaultVal = "null"; break; case ABCConstants.CONSTANT_False :
- * defaultVal = "false"; break; case ABCConstants.CONSTANT_True :
- * defaultVal = "true"; break; case ABCConstants.CONSTANT_Undefined
- * : defaultVal = "undefined"; break; case
- * ABCConstants.CONSTANT_Null : defaultVal = "null"; break; default
- * : defaultVal = "undefined"; break; } return( defaultVal );
- */
- }
- }
-
- protected Boolean emitVariable(Trait t, String baseName,
- String packageName, String className, String superClassName,
- String methodPrefix, String assignment, String separator, String indent) throws Exception
- {
- Boolean needsSkinPartProcessing = false;
- final Name name = t.getNameAttr("name");
- final Name type = t.getNameAttr(Trait.TRAIT_TYPE);
-
- // JSDoc
- List<String> jsdoc = new ArrayList<String>();
- // jsdoc.add("Member: " + createFullName(packageName, className + "." + baseName));
-
- if (name != null)
- {
- Namespace ns = name.getSingleQualifier();
- if (ns.getKind() == CONSTANT_PrivateNs)
- jsdoc.add("@private");
- else if (ns.getKind() == CONSTANT_ProtectedNs)
- jsdoc.add("@protected");
- else
- jsdoc.add("@expose");
- }
- if (t.getKind() == TRAIT_Const)
- jsdoc.add("@const");
- if (type != null)
- {
- final StringBuilder sb = new StringBuilder();
- JSGeneratingReducer.nameToJSDocType(m_project, type, sb);
- jsdoc.add("@type {" + sb.toString() + "}");
- }
-
- if (jsdoc.size() > 0)
- {
- writeString("\n");
- if (jsdoc.size() == 1)
- writeString(indent + "/** " + jsdoc.get(0) + " */\n");
- else
- {
- writeString(indent + "/**\n");
- for (String decl : jsdoc)
- {
- writeString(indent + " * " + decl + "\n");
- }
- writeString(indent + " */\n");
- }
- }
-
- writeString(indent + methodPrefix + baseName + assignment + ";\n\n");
-
- // Examine var/const metadata
- final Vector<Metadata> metaData = t.getMetadata();
- for (Metadata md : metaData)
- {
- if (md.getName().equals(IMetaAttributeConstants.ATTRIBUTE_SKIN_PART))
- {
- needsSkinPartProcessing = true;
- break;
- }
- }
-
- return needsSkinPartProcessing;
- }
-
- protected void emitTraits(Traits traits,
- Boolean isInstanceTraits, Boolean isExtern, Boolean isInterface, Boolean isPackageFunction,
- MethodInfo ctor, String packageName, String className, String superClassName,
- String methodPrefix, String assignmentOp, String separator, String indent) throws Exception
- {
- final Boolean isFramework = className.equals(JSSharedData.JS_FRAMEWORK_NAME);
- Boolean emitComma = false;
-
- // cache some data used by all the warnIfPrivateNameCollision() calls below
- IClassDefinition classDef = getClassDefinition(className, packageName);
- IClassDefinition baseClass = null;
- ASDefinitionFilter filter = null;
- if (classDef != null)
- {
- baseClass = classDef.resolveBaseClass(m_project);
- filter = new ASDefinitionFilter(ClassificationValue.ALL,
- ASDefinitionFilter.SearchScopeValue.INHERITED_MEMBERS,
- ASDefinitionFilter.AccessValue.ALL,
- baseClass);
- }
-
- // 1. emit constructor
- if (isInstanceTraits && ctor != null)
- {
- emitCtor(ctor, isExtern, isInterface, packageName, className, superClassName,
- methodPrefix, assignmentOp, separator, indent);
- }
-
- // Avoid emitting duplicate Traits, which starts happening after adding
- // this line to JSClassDirectiveProcessor::declareVariable():
- // this.classScope.traitsVisitor = (is_static)? ctraits: itraits;
- final Set<String> visitedTraits = new HashSet<String>();
-
- // 2. emit all variables before any methods
- boolean needsSkinPartProcessing = false;
-
- for (Trait t : traits)
- {
- // Get the kind byte with its flags set in the high nibble.
- switch (t.getKind())
- {
- case TRAIT_Var:
- case TRAIT_Const:
-
- final Name name = t.getNameAttr("name");
- Namespace ns = name.getSingleQualifier();
- if (ns.getKind() != CONSTANT_PrivateNs && isInstanceTraits)
- break;
- final String baseName = JSGeneratingReducer.getBasenameFromName(name);
-
- if (!visitedTraits.contains(baseName))
- {
- visitedTraits.add(baseName);
-
- // see JSGlobalDirectiveProcessor::declareFunction.
- // Functions at the global scope create a var of type '*'
- Boolean emitVar = true;
- if (isPackageFunction)
- {
- final Name type = t.getNameAttr("type");
- if (type == null || type.equals("Function"))
- {
- for (MethodInfo mi : methodInfos)
- {
- if (mi.getMethodName() != null && mi.getMethodName().equals(baseName))
- {
- emitMethod(t, mi, isFramework, isExtern, isInterface, isPackageFunction, baseName, baseName, "", "var ", assignmentOp, separator, indent);
- emitVar = false;
- break;
- }
- }
- }
- }
-
- if (emitVar)
- {
- writeString("\n");
- String slotValue = (String)t.getAttr(Trait.SLOT_VALUE);
- if (slotValue == null)
- slotValue = "";
- else
- {
- slotValue = " = " + slotValue;
- }
- boolean methodNeedsSkinPartProcessing = emitVariable(t, baseName,
- packageName, className, superClassName,
- methodPrefix, slotValue, separator, indent);
-
- needsSkinPartProcessing = needsSkinPartProcessing || methodNeedsSkinPartProcessing;
- // print warning in cases where FJS-24 is being hit
- String fullName = createFullName(packageName, className);
- if (!fullName.isEmpty())
- fullName += ".";
- fullName += baseName;
-
- warnIfPrivateNameCollision(baseClass, filter, baseName, fullName, "Field");
- }
- }
- break;
- case TRAIT_Method:
- case TRAIT_Function:
- case TRAIT_Getter:
- case TRAIT_Setter:
- {
- // methods will be processed below.
- }
- break;
- case TRAIT_Class:
- // TODO: non-zero slot id
- // writeString( "\n // ClassInfo: " + ((ClassInfo)t.getAttr(Trait.TRAIT_CLASS)).toString() + "\n" );
- break;
- default:
- throw new IllegalArgumentException("Unknown trait kind " + t.getKind());
- }
- }
- if (isInstanceTraits && ctor != null)
- {
- writeString("};\n"); // end of constructor
- final String cName = createFullName(packageName, className);
- writeString("goog.inherits(" + cName + ", " + superClassName + ");\n");
- }
-
- // 3. emit public vars
- for (Trait t : traits)
- {
- // Get the kind byte with its flags set in the high nibble.
- switch (t.getKind())
- {
- case TRAIT_Var:
- case TRAIT_Const:
-
- final Name name = t.getNameAttr("name");
- Namespace ns = name.getSingleQualifier();
- if (ns.getKind() == CONSTANT_PrivateNs)
- break;
- final String baseName = JSGeneratingReducer.getBasenameFromName(name);
-
- if (!visitedTraits.contains(baseName))
- {
- visitedTraits.add(baseName);
-
- // see JSGlobalDirectiveProcessor::declareFunction.
- // Functions at the global scope create a var of type '*'
- Boolean emitVar = true;
- if (isPackageFunction)
- {
- final Name type = t.getNameAttr("type");
- if (type == null || type.equals("Function"))
- {
- for (MethodInfo mi : methodInfos)
- {
- if (mi.getMethodName() != null && mi.getMethodName().equals(baseName))
- {
- emitMethod(t, mi, isFramework, isExtern, isInterface, isPackageFunction, baseName, baseName, "", "var ", assignmentOp, separator, indent);
- emitVar = false;
- break;
- }
- }
- }
- }
-
- if (emitVar)
- {
- String slotValue = (String)t.getAttr(Trait.SLOT_VALUE);
- if (slotValue == null)
- slotValue = "";
- else
- {
- slotValue = " = " + slotValue;
- }
- writeString("\n");
-
- boolean methodNeedsSkinPartProcessing = emitVariable(t, baseName,
- packageName, className, superClassName,
- (packageName == "") ? className + ".prototype." :
- packageName + "." + className + ".prototype.", slotValue, "", "");
-
- needsSkinPartProcessing = needsSkinPartProcessing || methodNeedsSkinPartProcessing;
- // print warning in cases where FJS-24 is being hit
- String fullName = createFullName(packageName, className);
- if (!fullName.isEmpty())
- fullName += ".";
- fullName += baseName;
-
- warnIfPrivateNameCollision(baseClass, filter, baseName, fullName, "Field");
- }
- }
- break;
- case TRAIT_Method:
- case TRAIT_Function:
- case TRAIT_Getter:
- case TRAIT_Setter:
- {
- // methods will be processed below.
- }
- break;
- case TRAIT_Class:
- // TODO: non-zero slot id
- // writeString( "\n // ClassInfo: " + ((ClassInfo)t.getAttr(Trait.TRAIT_CLASS)).toString() + "\n" );
- break;
- default:
- throw new IllegalArgumentException("Unknown trait kind " + t.getKind());
- }
- }
-
- String proto = isInstanceTraits ? ".prototype." : ".";
- // 4. emit all other methods (ctor already emitted)
- for (Trait t : traits)
- {
- // Get the kind byte with its flags set in the high nibble.
- switch (t.getKind())
- {
- case TRAIT_Method:
- case TRAIT_Function:
- case TRAIT_Getter:
- case TRAIT_Setter:
- {
- // we can't emit getter and setter for extern declarations.
- if (!isExtern || t.getKind() != TRAIT_Setter)
- {
-
- // write out full function name with package.
- Name name = t.getNameAttr("name");
- MethodInfo mi = (MethodInfo)t.getAttr("method_id");
- final String baseName = JSGeneratingReducer.getBasenameFromName(name);
-
- // write out comment with the full class name
- String fullName = createFullName(packageName, className);
- String xetter = "";
-
- // cleaning up static inits.
- // Static initializer is generated but not called for classes without explicit constructor
- //if ((!isInstanceTraits || ctor == null) && JSSharedData.instance.hasClassInit(fullName))
- // m_methodPrologue += " " + fullName + "." + JSSharedData.STATIC_INIT + "();\n";
-
- if (!isExtern)
- {
- if (t.getKind() == TRAIT_Getter)
- xetter = JSSharedData.GETTER_PREFIX;
- else if (t.getKind() == TRAIT_Setter)
- xetter = JSSharedData.SETTER_PREFIX;
- }
-
- if (!fullName.isEmpty())
- fullName += ".";
- fullName += xetter + baseName;
-
- // don't emit extern package functions
- if (!isExtern && isPackageFunction)
- isExtern = isExtern(name);
-
- // actually emit the JS code
- emitMethod(t, mi, isFramework, isExtern, isInterface, isPackageFunction, fullName, baseName, xetter,
- (packageName == "") ? className + proto :
- packageName + "." + className + proto , "=", "", "");
-
- // print warning in cases where FJS-24 is being hit
- warnIfPrivateNameCollision(baseClass, filter, baseName, fullName, "Method");
- }
- }
- break;
- }
- }
-
- // 5. custom methods generated from metadata
- if (needsSkinPartProcessing)
- {
- if (emitComma)
- writeString(separator + "\n");
- else
- emitComma = separator.equals(",");
-
- emitGeneratedSkinPartsMethod(className, packageName, methodPrefix, assignmentOp);
- }
-
- // 5. class constructor
- if (ctor != null && !isInstanceTraits)
- {
- // first check whether there is any code...
- final String body = getCodeForConstructor(ctor);
- if (!body.isEmpty())
- {
- if (emitComma)
- writeString(separator + "\n");
- else
- emitComma = separator.equals(",");
-
- final String fullName = createFullName(packageName, className);
-
- // writeString( "\n // Static inits:\n" );
- emitMethod(null, ctor, isFramework, isExtern, isInterface, isPackageFunction, fullName, null, "", methodPrefix, assignmentOp, separator, indent);
- }
- }
- }
-
- /**
- * Emits the skinParts getter definition that is implied by the use of
- * [SkinPart] metadata on a Flex class. TODO: once Falcon starts handling
- * [SkinPart] this code should probbly go away
- */
- private void emitGeneratedSkinPartsMethod(String className, String packageName, String methodPrefix, String assignmentOp)
- {
- IClassDefinition def = getClassDefinition(className, packageName);
- String jsonResult = JSFlexUtils.generateGetSkinPartsJSON(def, m_project);
-
- // Emit JSDoc -- based on emitJSDocForMethod()
- String methodName = "get_skinParts";
- String methodFullName = packageName + "." + className + "." + methodName;
- String indent = "";
- writeString(indent + "\n\n");
- writeString(indent + "/**\n");
- writeString(indent + " * Method: " + methodFullName + "()\n");
- writeString(indent + " * @this {" + methodFullName.substring(0, methodFullName.lastIndexOf(".")) + "}\n");
- writeString(indent + " * @protected\n");
- writeString(indent + " * @override\n");
- writeString(indent + " * @return {Object}\n");
- writeString(indent + " */\n");
-
- // Emit method definition itself -- based on emitMethod()
- writeString(indent + methodPrefix + methodName);
- writeString(" " + assignmentOp + " ");
-
- writeString("function() /* : Object */\n");
- writeString("{\n");
-
- indent = " ";
- writeString(indent + "return " + jsonResult + ";\n");
-
- writeString("}");
- }
-
- /**
- * Given a var or const trait, return the default value it should be
- * initialized to if there was no initializer in the AS code
- */
- public static String getDefaultInitializerForVariable(Name varType)
- {
- if (varType != null)
- {
- String typeName = JSGeneratingReducer.getBasenameFromName(varType);
-
- // int/uint default to 0 in AS; this matters since, e.g.: 0++ = 1; undefined++ = NaN
- if (typeName.equals("int") || typeName.equals("uint"))
- return "0";
-
- // Number defaults to naN
- if (typeName.equals("Number"))
- return "NaN";
-
- // Boolean defaults to false in AS; this matters when comparing two bools: undefined != false
- if (typeName.equals("Boolean"))
- return "false";
- }
- return "undefined";
- }
-
- /**
- * Given a class member and the class's base class, try to detect whether it
- * will hit FJS-24 - and if so print a warning. Intended to be called from
- * emitTraits().
- */
- public void warnIfPrivateNameCollision(IClassDefinition baseClass, ASDefinitionFilter baseClassAllFilter, String memberName, String memberFullName, String memberDescription)
- {
- // If baseClass is null, we're probably looking at a global function like trace() or setTimeout()
- if (baseClass != null)
- {
- IDefinition conflict = MemberedDefinitionUtils.getMemberByName(baseClass, m_project, memberName, baseClassAllFilter);
- if (conflict != null)
- {
- // If member is non-private, it's *expected* to be overridden (note: we could also check isOverride() on classDef's member)
- // If member is static, FJS-24 doesn't apply and all is well
- if (conflict.isPrivate() && !conflict.isStatic())
- {
- m_sharedData.stderr("Warning: " + memberDescription + " " + memberFullName + " will unexpectedly override a private member of superclass " + conflict.getParent().getBaseName());
- }
- }
- }
- }
-
- /*
- * private String getCodeForMethodInfo( MethodInfo mi ) { String body = "";
- * MethodBodyInfo mbi = findMethodBodyInfo( mi ); if( mbi != null ) { for
- * (Block b : mbi.getBlocks()) { for (int i = 0; i < b.instructions.size()
- * && !b.instructions.get(i).isBranch(); i++) { final Instruction insn =
- * b.instructions.get(i); if( insn.getOpcode() == JSSharedData.OP_JS ) {
- * final String str = (String)insn.getOperand(0); body +=
- * JSGeneratingReducer.indentBlock(str,1); } } } } return body; }
- */
-
- protected String getCodeForConstructor(MethodInfo mi)
- {
- String body = "";
- MethodBodyInfo mbi = findMethodBodyInfo(mi);
-
- if (mbi != null)
- {
- for (IBasicBlock b : mbi.getCfg().getBlocksInEntryOrder())
- {
- for (int i = 0; i < b.size() && !b.get(i).isBranch(); i++)
- {
- final Instruction insn = b.get(i);
- if (insn.getOpcode() == JSSharedData.OP_JS)
- {
- final String str = (String)insn.getOperand(0);
-
- // we are only interested in the instruction that initialize variables with a value.
- // if( str.contains("=") )
- body += JSGeneratingReducer.indentBlock(str, 1);
- }
- }
- }
- }
- return body;
- }
-
- private void emitJSDocForMethod(Trait t, MethodInfo mi, MethodBodyInfo mbi, String fullName, String indent)
- {
- final Boolean isCtor = t == null;
- final Boolean isInterface = mbi == null;
-
- writeString(indent + "\n\n");
- writeString(indent + "/**\n");
- /*
- if (isCtor)
- {
- writeString(indent + " * Constructor: " + fullName + "()\n");
- writeString(indent + " * @constructor\n");
- }
- else if (isInterface)
- {
- writeString(indent + " * Interface: " + fullName + "()\n");
- }
- else
- {
- writeString(indent + " * Method: " + fullName + "()\n");
- }
- */
- if (!isInterface)
- {
- if (fullName.contains("."))
- {
- if (fullName.substring(0, fullName.lastIndexOf(".")).equals(JSSharedData.JS_FRAMEWORK_NAME))
- writeString(indent + " * @this {" + JSSharedData.JS_FRAMEWORK_NAME + "}\n");
- else
- writeString(indent + " * @this {" + fullName.substring(0, fullName.lastIndexOf(".")) + "}\n");
- }
-
- if (t != null)
- {
- final Name name = t.getNameAttr("name");
- if (name != null)
- {
- Namespace ns = name.getSingleQualifier();
- if (ns.getKind() == CONSTANT_PrivateNs)
- writeString(indent + " * @private\n");
- else if (ns.getKind() == CONSTANT_ProtectedNs)
- writeString(indent + " * @protected\n");
- else
- writeString(indent + " * @expose\n");
- }
- if (t.isOverride() ||
- (t.hasAttr("override") && (Boolean)(t.getAttr("override")) == true))
- {
- writeString(indent + " * @override\n");
- }
- }
- }
-
- emitJSDocForParams(mi, indent);
-
- if (mi.getReturnType() != null && !JSGeneratingReducer.getBasenameFromName(mi.getReturnType()).equals("void"))
- {
- final StringBuilder sb = new StringBuilder();
- JSGeneratingReducer.nameToJSDocType(m_project, mi.getReturnType(), sb);
-
- writeString(indent + " * @return {" + sb.toString() + "}\n");
- }
-
- writeString(indent + " */\n");
- }
-
- private void emitJSDocForParams(MethodInfo mi, String indent)
- {
- Vector<PooledValue> defaultValues = mi.getDefaultValues();
- Vector<Name> paramTypes = mi.getParamTypes();
- List<String> paramNames = mi.getParamNames();
-
- int nthParam = 0;
- final int defaultsStartAt = paramTypes.size() - defaultValues.size();
- final Boolean needsRest = (mi.getFlags() & ABCConstants.NEED_REST) > 0;
- final int restStartsAt = needsRest ? paramNames.size() - 1 : paramNames.size();
-
- for (String argName : paramNames)
- {
- if (nthParam == restStartsAt)
- {
- // param is rest argument
- writeString(indent + " * @param {...} " + argName + "\n");
- }
- else
- {
- Name nextParam = paramTypes.elementAt(nthParam);
- final StringBuilder sb = new StringBuilder();
- JSGeneratingReducer.nameToJSDocType(m_project, nextParam, sb);
- final String argType = sb.toString();
- if (nthParam < defaultsStartAt)
- {
- // param without default value
- writeString(indent + " * @param {" + argType + "} " + argName + "\n");
- }
- else
- {
- // param with default value
- writeString(indent + " * @param {" + argType + "} " + JSSharedData.DEFAULT_PARAM_PREFIX + argName);
-
- String defaultVal = "undefined";
- PooledValue val = defaultValues.elementAt(nthParam - defaultsStartAt);
- if (val != null)
- {
- switch (val.getKind())
- {
- case ABCConstants.CONSTANT_Int:
- defaultVal = val.getIntegerValue().toString();
- break;
- case ABCConstants.CONSTANT_UInt:
- defaultVal = val.getLongValue().toString();
- break;
- case ABCConstants.CONSTANT_Double:
- defaultVal = val.getDoubleValue().toString();
- break;
- case ABCConstants.CONSTANT_Utf8:
- defaultVal = val.getStringValue();
- break;
- case ABCConstants.CONSTANT_True:
- defaultVal = "true";
- break;
- case ABCConstants.CONSTANT_False:
- defaultVal = "false";
- break;
- case ABCConstants.CONSTANT_Undefined:
- defaultVal = "undefined";
- break;
- case ABCConstants.CONSTANT_Null:
- defaultVal = "null";
- break;
- default:
- {
- final Namespace ns = val.getNamespaceValue();
- if (ns != null)
- defaultVal = ns.getName() + " /* (namespace) */";
- }
- break;
- }
- }
- writeString(" Defaults to " + defaultVal + ".\n");
- }
- }
-
- nthParam++;
- }
- }
-
- protected Boolean isPackageFunction(MethodInfo mi)
- {
- final FunctionDefinition fdef = m_methodInfoToDefinition.get(mi);
- if (fdef != null && fdef.getParent() instanceof PackageDefinition)
- return true;
-
- return false;
- }
-
- protected void emitFrameworkInit()
- {
- writeString("\n");
- writeString("// Overrides \n");
-
- writeString("adobe.globals = __global;\n");
-
- // auto-register classes
- writeString("" + JSSharedData.JS_CLASSES + " = {};\n");
- writeString("" + JSSharedData.JS_INT_CLASS + " = IntClass;\n");
- writeString("" + JSSharedData.JS_UINT_CLASS + " = UIntClass;\n");
-
- // override settings for adobe.USE_SELF and adobe.USE_STATIC
- final Boolean useClosure = JSSharedData.m_useClosureLib;
- final Boolean useSelfParameter = JSSharedData.m_useSelfParameter;
- final Boolean convertToStatic = useSelfParameter && false; // see JSSharedData.m_convertToStatic
- writeString("\n");
- writeString("// Settings \n");
- writeString("adobe.USE_CLOSURE = " + (useClosure ? "true" : "false") + ";\n");
- writeString("adobe.USE_SELF = " + (useSelfParameter ? "true" : "false") + ";\n");
- writeString("adobe.USE_STATIC = " + (convertToStatic ? "true" : "false") + ";\n");
- writeString("adobe.ROOT_NAME = \"" + JSSharedData.ROOT_NAME + "\";\n");
- writeString("adobe.NO_EXPORTS = " + JSSharedData.NO_EXPORTS + ";\n");
- writeString("adobe.root = " + JSSharedData.JS_SYMBOLS + ";\n");
- }
-
- protected void emitMethod(Trait t, MethodInfo mi, Boolean isFramework, Boolean isExtern, Boolean isInterface, Boolean isPackageFunction, String fullName, String name, String xetter, String methodPrefix, String assignmentOp, String separator, String indent) throws Exception
- {
- // don't emit extern package functions
- if (isExtern && isPackageFunction)
- return;
-
- MethodBodyInfo mbi = findMethodBodyInfo(mi);
-
- if (name != null)
- {
- // Sometimes mi.name is empty
- if (mi.getMethodName() == null || mi.getMethodName().isEmpty())
- mi.setMethodName(name);
-
- // set m_currentScope to classScope
- if (m_currentScope != null)
- {
- IASScope methodScope = null;
- IASScope scope = m_currentScope;
- ASDefinitionFilter filter = new ASDefinitionFilter(ClassificationValue.MEMBERS_AND_TYPES,
- SearchScopeValue.ALL_SCOPES,
- AccessValue.ALL,
- scope.getDefinition());
- IDefinition def = ASScopeUtils.findDefinitionByName(scope, m_project, name, filter);
- if (def != null)
- {
- //FunctionDefinition
- // methodScope = new ASScope((ASScope)def.getContainingScope());
- methodScope = def.getContainingScope();
- m_currentScope = methodScope;
- }
- }
-
- emitJSDocForMethod(t, mi, mbi, fullName, indent);
-
- final Boolean isGetter = t != null && t.getKind() == TRAIT_Getter;
- // final Boolean isPackageFunction = methodPrefix.isEmpty() && isPackageFunction(mi);
-
- // regular constructor
- writeString(indent + methodPrefix + xetter + name);
- if (isInterface && isGetter)
- {
- writeString(";\n");
- return;
- }
-
- writeString(" " + assignmentOp + " ");
-
- writeString("function(");
- String a_priori_insns = "";
- // a_priori_insns = emitParameters( m_methodInfoToDefinition.get(mi) );
- a_priori_insns = emitParameters(mi);
- writeString(")");
-
- // return type
- // if (mi.getReturnType() != null)
- // writeString(" /* : " + JSGeneratingReducer.getBasenameFromName(mi.getReturnType()) + " */");
-
- if (isInterface)
- {
- writeString(" {};\n");
- }
- else
- {
- writeString("\n");
- writeString(indent + "{");
- writeString("\n");
- if (!a_priori_insns.isEmpty())
- {
- writeString(a_priori_insns);
- }
- emitMethodBody(mbi);
- writeString(indent + "};");
- }
-
- }
- else
- {
- // all __static_inits need to be registered.
- if (!JSSharedData.instance.hasClassInit(fullName))
- JSSharedData.instance.registerClassInit(fullName);
-
- final String staticInitName = methodPrefix + JSSharedData.STATIC_INIT;
-
- writeString("\n\n");
- writeString("/**\n");
- writeString(" * Method: " + indent + staticInitName + "()\n");
- writeString(" */\n");
-
- writeString(indent + staticInitName + " = ");
- writeString("function() /* : void */\n");
- writeString(indent + "{\n");
- writeString(indent + " " + staticInitName + " = " + JSSharedData.JS_EMPTY_FUNCTION + ";\n");
-
- // static init
- emitMethodBody(mbi);
-
- writeString(indent + "}");
- }
- }
-
- private void emitScriptInfo(ScriptInfo info) throws Exception
- {
- // w.writeU30(getScriptId(info.getInitId()));
- // emitTraits(info.getTraits(), "", " " );
-
- final Object init_id = info.getInit();
- ;
- if (init_id instanceof MethodInfo)
- {
- final MethodInfo mi = (MethodInfo)init_id;
- final MethodBodyInfo mbi = this.findMethodBodyInfo(mi);
- if (mbi != null)
- {
- final String str = extractCodeFromMethodBodyInfo(mbi);
- if (!str.isEmpty())
- {
- final StringBuilder scriptInfos = new StringBuilder();
-
- scriptInfos.append("// ScriptInfo \n");
- scriptInfos.append("{\n");
- scriptInfos.append(" var " + JSSharedData.THIS + " = ");
- if (m_packageName != null && !m_packageName.isEmpty())
- {
- scriptInfos.append(m_packageName + ";\n");
- }
- else
- {
- scriptInfos.append(JSSharedData.JS_FRAMEWORK_NAME + ".globals;\n");
- }
-
- // This is just crazy...
- // It looks like very variable declared in a script info block becomes a global variable.
- // See testUnicodeRangeHelper() in Tamarin's ecma3/Unicode/unicodeUtil.as, which for some
- // reasons uses "this.array" instead of just "array".
- final StringBuilder sb = new StringBuilder();
- for (String line : str.split("\n"))
- {
- if (line.startsWith("var "))
- sb.append(line.replaceFirst("var ", JSSharedData.THIS + "."));
- else
- sb.append(line);
- sb.append("\n");
- }
-
- // the meat of emitCode(mbi);
- scriptInfos.append(JSGeneratingReducer.indentBlock(sb.toString(), 1));
-
- scriptInfos.append("}\n");
-
- JSSharedData.instance.registerScriptInfo(scriptInfos.toString());
- }
- }
- }
- }
-
- protected void emitMethodBody(MethodBodyInfo f)
- throws Exception
- {
- if (f == null)
- return;
-
- /*
- * MethodInfo signature = f.getMethodInfo();
- * w.writeU30(getMethodId(signature)); f.computeFrameCounts();
- * w.writeU30(f.getMaxStack()); int max_local = f.getLocalCount(); if
- * (signature.getParamCount() > max_local) max_local =
- * signature.getParamCount(); w.writeU30(max_local);
- * w.writeU30(f.getInitScopeDepth()); w.writeU30(f.getMaxScopeDepth());
- */
-
- if (!m_methodPrologue.isEmpty())
- {
- writeString(m_methodPrologue);
- m_methodPrologue = "";
- }
-
- emitCode(f);
-
- if (!m_methodPostlogue.isEmpty())
- {
- writeString(m_methodPostlogue);
- m_methodPostlogue = "";
- }
- }
-
- private void emitCode(MethodBodyInfo f)
- throws Exception
- {
- String str = extractCodeFromMethodBodyInfo(f);
-
- /*
- * Experimental: ABC decompilation if( str.isEmpty() ) { final
- * ByteArrayOutputStream out = new ByteArrayOutputStream(); final
- * JSConverter converter = new JSConverter(m_project, m_currentScope,
- * out ); final MethodInfo mi = f.getMethodInfo(); final IMethodVisitor
- * mv = converter.visitMethod(mi); mv.visit(); final IMethodBodyVisitor
- * mbv = mv.visitBody(f); mbv.visit(); mbv.visitEnd(); mv.visitEnd();
- * str = out.toString(); }
- */
-
- if (!str.isEmpty())
- {
- writeString(JSGeneratingReducer.indentBlock(str, 1));
- }
- }
-
- /*
- * private String indentBlock( String block, int indentBy ) { Boolean
- * firstPart = true; String s = ""; String[] parts = block.split( "\n" );
- * for( String part : parts ) { if( firstPart ) firstPart = false; else s +=
- * "\n"; for( int i = 0; i < indentBy; ++i ) s += " "; s += part; } return
- * s; } private void emitNamespace(Namespace ns) { w.write(ns.getKind());
- * w.writeU30(stringPool.id(ns.getName())); }
- */
-
- private String extractCodeFromBlock(IBasicBlock b)
- {
- String str = "";
- for (int i = 0; i < b.size() && !b.get(i).isBranch(); i++)
- {
- final Instruction insn = b.get(i);
- if (insn.getOpcode() == JSSharedData.OP_JS)
- str += (String)insn.getOperand(0);
- }
- return str;
- }
-
- private String extractCodeFromMethodBodyInfo(MethodBodyInfo mbi)
- {
- String str = "";
- for (IBasicBlock b : mbi.getCfg().getBlocksInEntryOrder())
- {
- str += extractCodeFromBlock(b);
- }
- return str;
- }
-
- class JSOutputStream extends ByteArrayOutputStream
- {
- void rewind(int n)
- {
- super.count -= n;
- }
-
- void writeString(String str)
- {
- try
- {
- write(str.getBytes());
- }
- catch (IOException e)
- {
-
- }
- }
-
- public void write(int i)
- {
- // super.write(i);
- }
-
- void writeU16(int i)
- {
- //write(i);
- //write(i >> 8);
- }
-
- void writeS24(int i)
- {
- //writeU16(i);
- //write(i >> 16);
- }
-
- void write64(long i)
- {
- //writeS24((int)i);
- //writeS24((int)(i >> 24));
- //writeU16((int)(i >> 48));
- }
-
- void writeU30(int v)
- {
- /*
- * if (v < 128 && v >= 0) { write(v); } else if (v < 16384 && v >=
- * 0) { write(v & 0x7F | 0x80); write(v >> 7); } else if (v <
- * 2097152 && v >= 0) { write(v & 0x7F | 0x80); write(v >> 7 |
- * 0x80); write(v >> 14); } else if (v < 268435456 && v >= 0) {
- * write(v & 0x7F | 0x80); write(v >> 7 | 0x80); write(v >> 14 |
- * 0x80); write(v >> 21); } else { write(v & 0x7F | 0x80); write(v
- * >> 7 | 0x80); write(v >> 14 | 0x80); write(v >> 21 | 0x80);
- * write(v >> 28); }
- */
- }
-
- int sizeOfU30(int v)
- {
- if (v < 128 && v >= 0)
- {
- return 1;
- }
- else if (v < 16384 && v >= 0)
- {
- return 2;
- }
- else if (v < 2097152 && v >= 0)
- {
- return 3;
- }
- else if (v < 268435456 && v >= 0)
- {
- return 4;
- }
- else
- {
- return 5;
- }
- }
- }
-
- /**
- * The nominal name given to a MultinameL.
- *
- * @see http://bugs.adobe.com/jira/browse/CMP-393, this may not be
- * necessary, and if under some circumstances it is necessary this is
- * certainly not the name required.
- */
- private static Name indexAccessName;
- /**
- * The above Name packaged up into operand form.
- */
- private static Object[] indexAccessOperands;
- /*
- * Initialization code for indexAccessname and indexAccessOperands.
- */
- static
- {
- Vector<Namespace> usual_suspects = new Vector<Namespace>(2);
- usual_suspects.add(new Namespace(CONSTANT_PrivateNs));
- usual_suspects.add(new Namespace(CONSTANT_PackageNs));
- indexAccessName = new Name(ABCConstants.CONSTANT_MultinameL, new Nsset(usual_suspects), null);
- indexAccessOperands = new Object[] {indexAccessName};
- }
-
- /**
- * Find all the operands in a method body and make sure they find their way
- * into the appropriate pool.
- *
- * @param mi - the method body.
- * @post any runtime multinames have a dummy Name operand.
- */
- void _poolOperands(MethodBodyInfo mbi)
- {
- for (IBasicBlock b : mbi.getCfg().getBlocksInEntryOrder())
- for (Instruction insn : b.getInstructions())
- switch (insn.getOpcode())
- {
- case OP_findproperty:
- case OP_findpropstrict:
- case OP_getlex:
- case OP_getsuper:
- case OP_setsuper:
- case OP_getdescendants:
- case OP_initproperty:
- case OP_istype:
- case OP_coerce:
- case OP_astype:
- case OP_finddef:
- visitPooledName((Name)insn.getOperand(0));
- break;
- case OP_deleteproperty:
- case OP_getproperty:
- case OP_setproperty:
- if (insn.getOperandCount() > 0 && insn.getOperand(0) != null)
- {
- visitPooledName((Name)insn.getOperand(0));
- }
- else
- {
- // get/set/deleteproperty with no operands => runtime multiname.
- visitPooledName(indexAccessName);
- insn.setOperands(indexAccessOperands);
- }
- break;
- case OP_callproperty:
- case OP_callproplex:
- case OP_callpropvoid:
- case OP_callsuper:
- case OP_callsupervoid:
- case OP_constructprop:
- visitPooledName((Name)insn.getOperand(0));
- break;
- case OP_pushstring:
- case OP_dxns:
- case OP_debugfile:
- break;
- case OP_pushnamespace:
- visitPooledNamespace((Namespace)insn.getOperand(0));
- break;
- case OP_pushint:
- break;
- case OP_pushuint:
- break;
- case OP_pushdouble:
- break;
- case OP_debug:
- break;
- }
- }
-
- /**
- * Inspect a set of Traits and ensure that constant initializer values have
- * been properly registered in the constant pools.
- */
- private void poolTraitValues(Traits ts)
- {
- for (Trait t : ts)
- {
- if (t.hasAttr(T
<TRUNCATED>