incubator-flex-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From aha...@apache.org
Subject svn commit: r1413061 [8/14] - in /incubator/flex/falcon/trunk/compiler.js: ./ bin/ build/ in/ intermediates/ localization/ localization/src/ localization/src/org/ localization/src/org/apache/ localization/src/org/apache/flex/ localization/src/org/apach...
Date Fri, 23 Nov 2012 20:58:56 GMT
Propchange: incubator/flex/falcon/trunk/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSEmitter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/falcon/trunk/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSFlexUtils.java
URL: http://svn.apache.org/viewvc/incubator/flex/falcon/trunk/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSFlexUtils.java?rev=1413061&view=auto
==============================================================================
--- incubator/flex/falcon/trunk/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSFlexUtils.java
(added)
+++ incubator/flex/falcon/trunk/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSFlexUtils.java
Fri Nov 23 20:58:50 2012
@@ -0,0 +1,152 @@
+/*
+ *
+ *  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 java.util.HashMap;
+import java.util.Map;
+
+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.ITypeDefinition;
+import org.apache.flex.compiler.definitions.IVariableDefinition;
+import org.apache.flex.compiler.definitions.metadata.IMetaTag;
+import org.apache.flex.compiler.internal.legacy.ASDefinitionFilter;
+import org.apache.flex.compiler.internal.legacy.MemberedDefinitionUtils;
+import org.apache.flex.compiler.projects.ICompilerProject;
+
+/**
+ * Utilities for Flex-oriented special cases in FalconJS compilation. Example:
+ * handling the [SkinPart] metatag
+ */
+public class JSFlexUtils
+{
+    /**
+     * Generates a JavaScript object literal (JSON string) representing the
+     * value that should be returned by the generated get_skinParts() method.
+     * The JSON object is a map from skin part id to a boolean indicating
+     * whether the part is required.
+     */
+    public static String generateGetSkinPartsJSON(IClassDefinition classDef, ICompilerProject
project)
+    {
+        // Gather set of skin parts
+        Map<String, JSFlexUtils.SkinPartInfo> skinPartsInfo = JSFlexUtils.getSkinParts(classDef,
project);
+
+        // Build the JSON string
+        StringBuilder partsObj = new StringBuilder();
+        partsObj.append("{ ");
+
+        // for each skin part...
+        boolean comma = false;
+        for (JSFlexUtils.SkinPartInfo skinPart : skinPartsInfo.values())
+        {
+            if (comma)
+                partsObj.append(", ");
+            else
+                comma = true;
+
+            partsObj.append(skinPart.name);
+            partsObj.append(": ");
+            partsObj.append(skinPart.required);
+        }
+
+        partsObj.append(" }");
+
+        return partsObj.toString();
+    }
+
+    /**
+     * Returns a map specifying the skin parts of the given class. The keys are
+     * the skin part ids, and the values are SkinPartInfo objects containing
+     * additional information about each part.
+     */
+    public static Map<String, SkinPartInfo> getSkinParts(IClassDefinition componentClass,
ICompilerProject project)
+    {
+        // NOTE: derived from ModelUtils.getSkinPartsForType() in the Flash Builder codebase
(in com.adobe.flexide.mxmlmodel plugin)
+
+        ASDefinitionFilter filter = new ASDefinitionFilter(ASDefinitionFilter.ClassificationValue.VARIABLES,
+                                                           ASDefinitionFilter.SearchScopeValue.INHERITED_MEMBERS,
+                                                           ASDefinitionFilter.AccessValue.ALL,
+                                                           componentClass);
+        IDefinition[] members = MemberedDefinitionUtils.getAllMembers(componentClass, project,
filter);
+
+        HashMap<String, SkinPartInfo> map = new HashMap<String, SkinPartInfo>();
+
+        // For each variable declared in class...
+        for (IDefinition member : members)
+        {
+            IVariableDefinition variable = (IVariableDefinition)member;
+
+            // Is it tagged [SkinPart] ?
+            IMetaTag skinPartTag = variable.getMetaTagByName(IMetaAttributeConstants.ATTRIBUTE_SKIN_PART);
+            if (skinPartTag != null)
+            {
+                // Gather information about the skin part
+                String name = variable.getBaseName();
+                ITypeDefinition partType = variable.resolveType(project);
+                String asClass = partType != null ? partType.getQualifiedName() : null;
+                boolean required = parseRequired(skinPartTag);
+
+                SkinPartInfo info = new SkinPartInfo(name, asClass, required);
+
+                // Add to result
+                // Note: We get duplicates for [Bindable] variables because they generate
getter/setter pairs
+                map.put(name, info);
+            }
+        }
+
+        return map;
+    }
+
+    private static boolean parseRequired(IMetaTag metaTag)
+    {
+        String requiredStr = metaTag.getAttributeValue(IMetaAttributeConstants.NAME_SKIN_PART_REQUIRED);
+        return requiredStr != null && requiredStr.length() > 0 &&
+               requiredStr.equals(IMetaAttributeConstants.VALUE_SKIN_PART_REQUIRED_TRUE);
+    }
+
+    /**
+     * Value object representing information about a skin part. Immutable. NOTE:
+     * derived from ModelUtils.SkinPartInfo in the Flash Builder codebase
+     */
+    public static class SkinPartInfo
+    {
+        /** Part name - this should be set as the ID in the skin. Not null. */
+        public final String name;
+
+        /**
+         * Type of the part, or null if the type could not be resolved on the
+         * classpath.
+         */
+        public final String asClass;
+
+        /** Does the metadata indicate that the part is required? */
+        public final boolean required;
+
+        public SkinPartInfo(String name, String asClass, boolean required)
+        {
+            assert name != null;
+            assert asClass != null;
+            this.name = name;
+            this.asClass = asClass;
+            this.required = required;
+        }
+    }
+}

Propchange: incubator/flex/falcon/trunk/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSFlexUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message