You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2021/09/08 16:16:15 UTC

[royale-compiler] branch develop updated: js-getter-prefix and js-setter-prefix compiler options

This is an automated email from the ASF dual-hosted git repository.

joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/develop by this push:
     new 3f89ec9  js-getter-prefix and js-setter-prefix compiler options
3f89ec9 is described below

commit 3f89ec9196b2645de234be7d4a9247ebff772531
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Wed Sep 8 09:15:57 2021 -0700

    js-getter-prefix and js-setter-prefix compiler options
    
    Allows the names of the getter/setter functions generated for JS to be customized. If Royale is targeting an existing framework that uses different names (such as get_ instead of get__), this ensures that subclassing works as expected.
---
 .../internal/codegen/js/jx/AccessorEmitter.java    | 62 +++++++++-------------
 .../codegen/js/jx/BinaryOperatorEmitter.java       |  6 +--
 .../internal/codegen/js/jx/FieldEmitter.java       | 32 ++++++-----
 .../codegen/js/jx/MemberAccessEmitter.java         | 10 ++--
 .../internal/codegen/js/jx/SuperCallEmitter.java   | 10 ++--
 .../codegen/js/royale/JSRoyaleEmitter.java         | 28 ++++++++++
 .../driver/js/goog/JSGoogCompcConfiguration.java   | 38 +++++++++++++
 .../driver/js/goog/JSGoogConfiguration.java        | 38 +++++++++++++
 8 files changed, 159 insertions(+), 65 deletions(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
index 2c193bc..f14a956 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
@@ -181,13 +181,12 @@ public class AccessorEmitter extends JSSubEmitter implements
 	            			INamespaceDecorationNode ns = ((FunctionNode)getterNode).getActualNamespaceNode();
 	            			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
 	            			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
-	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
+	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatGetter(baseName), true));
 	                    }
 	                    else
 	                    {
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
-	                        write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-	                    	write(baseName);
+                            write(fjs.formatGetter(baseName));
 	                    }
 	                    write(ASEmitterTokens.SPACE);
 	                    write(ASEmitterTokens.EQUAL);
@@ -241,18 +240,16 @@ public class AccessorEmitter extends JSSubEmitter implements
 	            			INamespaceDecorationNode ns = ((FunctionNode)setterNode).getActualNamespaceNode();
 	            			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
 	            			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
-	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
+	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatSetter(baseName), true));
 	                    }
 	                    else
 	                    {
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
 	                        if (isBindable) {
 								write(JSRoyaleEmitterTokens.BINDABLE_PREFIX);
-								write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-								write(getEmitter().formatPrivateName(definition.getQualifiedName(), baseName, true));
+                                write(fjs.formatSetter(fjs.formatPrivateName(definition.getQualifiedName(), baseName, true)));
 							} else {
-								write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-								write(baseName);
+                                write(fjs.formatSetter(baseName));
 							}
 	                    }
 	                    write(ASEmitterTokens.SPACE);
@@ -274,8 +271,7 @@ public class AccessorEmitter extends JSSubEmitter implements
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
 	                        write(JSEmitterTokens.PROTOTYPE);
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
-	                        write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-	                    	write(baseName);
+                            write(fjs.formatSetter(baseName));
 	                        write(ASEmitterTokens.SPACE);
 	                        write(ASEmitterTokens.EQUAL);
 	                        write(ASEmitterTokens.SPACE);
@@ -293,8 +289,7 @@ public class AccessorEmitter extends JSSubEmitter implements
 	                        write(ASEmitterTokens.SPACE);
 	                        write(ASEmitterTokens.THIS);
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
-	                        write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-	                    	write(baseName);
+	                        write(fjs.formatGetter(baseName));
 	                        write(ASEmitterTokens.PAREN_OPEN);
 	                        write(ASEmitterTokens.PAREN_CLOSE);
 	                        writeNewline(ASEmitterTokens.SEMICOLON);
@@ -308,8 +303,7 @@ public class AccessorEmitter extends JSSubEmitter implements
 	                        write(ASEmitterTokens.THIS);
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
 	                        write(JSRoyaleEmitterTokens.BINDABLE_PREFIX);
-	                        write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-							write(getEmitter().formatPrivateName(definition.getQualifiedName(), baseName, true));
+                            write(fjs.formatSetter(fjs.formatPrivateName(definition.getQualifiedName(), baseName, true)));
 	                        write(ASEmitterTokens.PAREN_OPEN);
 	                        write("value");
 	                        write(ASEmitterTokens.PAREN_CLOSE);
@@ -396,13 +390,12 @@ public class AccessorEmitter extends JSSubEmitter implements
             			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
             			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
             			//String s = nsDef.getURI();
-            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
+            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatGetter(baseName), true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
-                        write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                    	write(baseName);
+                        write(fjs.formatGetter(baseName));
                     }
                     wroteGetter = true;
                 }
@@ -429,13 +422,12 @@ public class AccessorEmitter extends JSSubEmitter implements
                 			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
                 			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
                 			//String s = nsDef.getURI();
-                			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
+                			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatGetter(baseName), true));
                         }
                         else
                         {
                             write(ASEmitterTokens.MEMBER_ACCESS);
-                            write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                        	write(baseName);
+                            write(fjs.formatGetter(baseName));
                         }
                         wroteGetter = true;
                 	}
@@ -457,13 +449,12 @@ public class AccessorEmitter extends JSSubEmitter implements
             			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
             			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
             			//String s = nsDef.getURI();
-            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
+            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatSetter(baseName), true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
-                        write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                    	write(baseName);
+                        write(fjs.formatSetter(baseName));
                     }
                 }
                 else if (getterNode != null/* && getterNode.getDefinition().isOverride()*/)
@@ -491,13 +482,12 @@ public class AccessorEmitter extends JSSubEmitter implements
                 			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
                 			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
                 			//String s = nsDef.getURI();
-                			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
+                			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatSetter(baseName), true));
                         }
                         else
                         {
                             write(ASEmitterTokens.MEMBER_ACCESS);
-                            write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                        	write(baseName);
+                            write(fjs.formatSetter(baseName));
                         }
                 	}
                 }
@@ -594,13 +584,12 @@ public class AccessorEmitter extends JSSubEmitter implements
 	            			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
 	            			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
 	            			//String s = nsDef.getURI();
-	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri , JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
+	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri , fjs.formatGetter(baseName), true));
 	                    }
 	                    else
 	                    {
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
-	                        write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-	                    	write(baseName);
+	                        write(fjs.formatGetter(baseName));
 	                    }
 	                    write(ASEmitterTokens.SPACE);
 	                    write(ASEmitterTokens.EQUAL);
@@ -624,13 +613,12 @@ public class AccessorEmitter extends JSSubEmitter implements
 	            			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
 	            			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
 	            			//String s = nsDef.getURI();
-	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
+	            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatSetter(baseName), true));
 	                    }
 	                    else
 	                    {
 	                        write(ASEmitterTokens.MEMBER_ACCESS);
-	                        write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-	                    	write(baseName);
+                            write(fjs.formatSetter(baseName));
 	                    }
 	                    write(ASEmitterTokens.SPACE);
 	                    write(ASEmitterTokens.EQUAL);
@@ -708,13 +696,12 @@ public class AccessorEmitter extends JSSubEmitter implements
             			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
             			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
             			//String s = nsDef.getURI();
-            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.GETTER_PREFIX.getToken() + baseName, true));
+            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatGetter(baseName), true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
-                        write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                    	write(baseName);
+                        write(fjs.formatGetter(baseName));
                     }
                 }
                 if (setterNode != null)
@@ -732,13 +719,12 @@ public class AccessorEmitter extends JSSubEmitter implements
             			INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
             			fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names 
             			//String s = nsDef.getURI();
-            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, JSRoyaleEmitterTokens.SETTER_PREFIX.getToken() + baseName, true));
+            			write(JSRoyaleEmitter.formatNamespacedProperty(p.uri, fjs.formatSetter(baseName), true));
                     }
                     else
                     {
                         write(ASEmitterTokens.MEMBER_ACCESS);
-                        write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                    	write(baseName);
+                        write(fjs.formatSetter(baseName));
                     }
                 }
                 write(ASEmitterTokens.BLOCK_CLOSE);
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index e5a1ab2..0b98f44 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -156,8 +156,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSGoogEmitterTokens.SUPERCLASS);
                         write(ASEmitterTokens.MEMBER_ACCESS);
-                        write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                        write(rnodeDef.getBaseName());
+                        write(fjs.formatSetter(rnodeDef.getBaseName()));
                         write(ASEmitterTokens.MEMBER_ACCESS);
                         write(JSEmitterTokens.APPLY);
                         write(ASEmitterTokens.PAREN_OPEN);
@@ -171,8 +170,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
                             write(ASEmitterTokens.MEMBER_ACCESS);
                             write(JSGoogEmitterTokens.SUPERCLASS);
                             write(ASEmitterTokens.MEMBER_ACCESS);
-                            write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                            write(rnodeDef.getBaseName());
+							write(fjs.formatGetter(rnodeDef.getBaseName()));
                             write(ASEmitterTokens.MEMBER_ACCESS);
                             write(JSEmitterTokens.APPLY);
                             write(ASEmitterTokens.PAREN_OPEN);
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java
index d21aca8..e3e8b21 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FieldEmitter.java
@@ -164,9 +164,9 @@ public class FieldEmitter extends JSSubEmitter implements
             className = getEmitter().formatQualifiedName(definition.getQualifiedName());
             if (isComplexInitializedStatic)
             {
-	            write(className
-	                    + ASEmitterTokens.MEMBER_ACCESS.getToken() + JSRoyaleEmitterTokens.GETTER_PREFIX.getToken());
-	            writeFieldName(node, fjs);
+	            write(className);
+                write(ASEmitterTokens.MEMBER_ACCESS.getToken());
+                write(fjs.formatGetter(getFieldName(node, fjs)));
 	            endMapping(node.getNameExpressionNode());
                 write(ASEmitterTokens.SPACE);
                 writeToken(ASEmitterTokens.EQUAL);
@@ -187,7 +187,7 @@ public class FieldEmitter extends JSSubEmitter implements
                 write(className);
                 writeToken(ASEmitterTokens.COMMA);
                 writeToken(ASEmitterTokens.BLOCK_OPEN);
-	            writeFieldName(node, fjs);
+	            write(getFieldName(node, fjs));
                 writeToken(ASEmitterTokens.COLON);
                 if (node.isConst())
                 	write("{ value: value, writable: false }");
@@ -204,9 +204,9 @@ public class FieldEmitter extends JSSubEmitter implements
                 writeNewline(ASEmitterTokens.SEMICOLON);
                 if (!node.isConst())
                 {
-		            write(className
-		                    + ASEmitterTokens.MEMBER_ACCESS.getToken() + JSRoyaleEmitterTokens.SETTER_PREFIX.getToken());
-		            writeFieldName(node, fjs);
+		            write(className);
+                    write(ASEmitterTokens.MEMBER_ACCESS.getToken());
+                    write(fjs.formatSetter(getFieldName(node, fjs)));
 	                write(ASEmitterTokens.SPACE);
 	                writeToken(ASEmitterTokens.EQUAL);
 	                write(ASEmitterTokens.FUNCTION);
@@ -221,7 +221,7 @@ public class FieldEmitter extends JSSubEmitter implements
 	                write(className);
 	                writeToken(ASEmitterTokens.COMMA);
                     writeToken(ASEmitterTokens.BLOCK_OPEN);
-		            writeFieldName(node, fjs);
+		            write(getFieldName(node, fjs));
 	                writeToken(ASEmitterTokens.COLON);
 	                write("{ value: value, writable: true }");
                     write(ASEmitterTokens.BLOCK_CLOSE);
@@ -239,7 +239,7 @@ public class FieldEmitter extends JSSubEmitter implements
                 }
                 write(className);
                 write(ASEmitterTokens.MEMBER_ACCESS);
-                writeFieldName(node, fjs);
+                write(getFieldName(node, fjs));
                 write(ASEmitterTokens.SEMICOLON);
                 writeNewline();
                 writeNewline();
@@ -257,7 +257,7 @@ public class FieldEmitter extends JSSubEmitter implements
                 {
                     ((IJSGoogDocEmitter) getEmitter().getDocEmitter()).emitFieldDoc(node, def, getProject());
                 }
-	            writeFieldName(node, fjs);
+	            write(getFieldName(node, fjs));
                 writeToken(ASEmitterTokens.COLON);
                 writeNewline(ASEmitterTokens.BLOCK_OPEN, true);
                 write(ASEmitterTokens.GET);
@@ -265,8 +265,7 @@ public class FieldEmitter extends JSSubEmitter implements
                 write(ASEmitterTokens.SPACE);
                 write(className);
                 write(ASEmitterTokens.MEMBER_ACCESS);
-                write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-	            writeFieldName(node, fjs);
+                write(fjs.formatGetter(getFieldName(node, fjs)));
 	            if (!node.isConst())
 	            {
 	            	writeNewline(ASEmitterTokens.COMMA);
@@ -275,8 +274,7 @@ public class FieldEmitter extends JSSubEmitter implements
 	                write(ASEmitterTokens.SPACE);
 	                write(className);
 	                write(ASEmitterTokens.MEMBER_ACCESS);
-	                write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-		            writeFieldName(node, fjs);
+	                write(fjs.formatSetter(getFieldName(node, fjs)));
 	            }
             	writeNewline(ASEmitterTokens.COMMA);
                 write("configurable: true");
@@ -480,7 +478,7 @@ public class FieldEmitter extends JSSubEmitter implements
         }
     }
     
-    private void writeFieldName(IVariableNode node, JSRoyaleEmitter fjs)
+    private String getFieldName(IVariableNode node, JSRoyaleEmitter fjs)
     {
         String qname = node.getName();
         IDefinition nodeDef = node.getDefinition();
@@ -492,9 +490,9 @@ public class FieldEmitter extends JSSubEmitter implements
             INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(getProject());
             fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
             String s = nsDef.getURI();
-            write(JSRoyaleEmitter.formatNamespacedProperty(s, qname, false));
+            return JSRoyaleEmitter.formatNamespacedProperty(s, qname, false);
         }
-        else write(qname);
+        return qname;
     }
 
     public boolean emitFieldInitializer(IVariableNode node)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index fdb18a3..19c57db 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -563,6 +563,7 @@ public class MemberAccessEmitter extends JSSubEmitter implements
 
     private boolean writeLeftSide(IMemberAccessExpressionNode node, IASNode leftNode, IASNode rightNode)
     {
+        JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
         if (!(leftNode instanceof ILanguageIdentifierNode && ((ILanguageIdentifierNode) leftNode)
                 .getKind() == ILanguageIdentifierNode.LanguageIdentifierKind.THIS))
         {
@@ -584,11 +585,14 @@ public class MemberAccessEmitter extends JSSubEmitter implements
 					write(ASEmitterTokens.MEMBER_ACCESS);
 					write(JSGoogEmitterTokens.SUPERCLASS);
 					write(ASEmitterTokens.MEMBER_ACCESS);
-					write(JSRoyaleEmitterTokens.GETTER_PREFIX);
 					if (rightDef != null)
-						write(rightDef.getBaseName());
+					{
+						write(fjs.formatGetter(rightDef.getBaseName()));
+					}
 					else
-						write(((GetterNode) rightNode).getName());
+					{
+						write(fjs.formatGetter(((IGetterNode) rightNode).getName()));
+					}
 					write(ASEmitterTokens.MEMBER_ACCESS);
 					write(JSEmitterTokens.APPLY);
 					write(ASEmitterTokens.PAREN_OPEN);
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/SuperCallEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/SuperCallEmitter.java
index 285773b..3472752 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/SuperCallEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/SuperCallEmitter.java
@@ -53,6 +53,7 @@ public class SuperCallEmitter extends JSSubEmitter
 
     public void emit(IASNode node, String type)
     {
+        JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
         IFunctionNode fnode = (node instanceof IFunctionNode) ? (IFunctionNode) node
                 : null;
         IFunctionCallNode fcnode = (node instanceof IFunctionCallNode) ? (FunctionCallNode) node
@@ -102,10 +103,13 @@ public class SuperCallEmitter extends JSSubEmitter
                 write(JSGoogEmitterTokens.SUPERCLASS);
                 write(ASEmitterTokens.MEMBER_ACCESS);
                 if (fnode.getNodeID() == ASTNodeID.GetterID)
-                    write(JSRoyaleEmitterTokens.GETTER_PREFIX);
+                {
+                    write(fjs.formatGetter(fnode.getName()));
+                }
                 else
-                    write(JSRoyaleEmitterTokens.SETTER_PREFIX);
-                write(fnode.getName());
+                {
+                    write(fjs.formatSetter(fnode.getName()));
+                }
                 write(ASEmitterTokens.MEMBER_ACCESS);
                 write(JSEmitterTokens.APPLY);
                 write(ASEmitterTokens.PAREN_OPEN);
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
index 471994c..8906935 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
@@ -305,6 +305,34 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter
     	return Joiner.on("\n").join(finalLines);
     }
 
+    public String formatGetter(String name) {
+        String prefix = JSRoyaleEmitterTokens.GETTER_PREFIX.getToken();
+        RoyaleJSProject project = (RoyaleJSProject) getWalker().getProject();
+        if (project.config != null)
+        {
+            String configPrefix = project.config.getJsGetterPrefix();
+            if(configPrefix != null && configPrefix.length() > 0)
+            {
+                prefix = configPrefix;
+            }
+        }
+        return prefix + name;
+    }
+
+    public String formatSetter(String name) {
+        String prefix = JSRoyaleEmitterTokens.SETTER_PREFIX.getToken();
+        RoyaleJSProject project = (RoyaleJSProject) getWalker().getProject();
+        if (project.config != null)
+        {
+            String configPrefix = project.config.getJsSetterPrefix();
+            if(configPrefix != null && configPrefix.length() > 0)
+            {
+                prefix = configPrefix;
+            }
+        }
+        return prefix + name;
+    }
+
     public BindableEmitter getBindableEmitter()
     {
         return bindableEmitter;
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java
index 53ee681..3d92bd2 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java
@@ -499,4 +499,42 @@ public class JSGoogCompcConfiguration extends JSConfiguration
     	inlineConstants = value;
     }
 
+    //
+    // 'js-getter-prefix'
+    //
+
+    protected String jsGetterPrefix = "";
+
+    public String getJsGetterPrefix()
+    {
+        return jsGetterPrefix;
+    }
+
+    @Config
+    @Mapping("js-getter-prefix")
+    public void setJsGetterPrefix(ConfigurationValue cv, String value)
+            throws ConfigurationException
+    {
+        jsGetterPrefix = value;
+    }
+
+    //
+    // 'js-setter-prefix'
+    //
+
+    protected String jsSetterPrefix = "";
+
+    public String getJsSetterPrefix()
+    {
+        return jsSetterPrefix;
+    }
+
+    @Config
+    @Mapping("js-setter-prefix")
+    public void setJsSetterPrefix(ConfigurationValue cv, String value)
+            throws ConfigurationException
+    {
+        jsSetterPrefix = value;
+    }
+
 }
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java
index 5c00370..009ea52 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java
@@ -1008,4 +1008,42 @@ public class JSGoogConfiguration extends JSConfiguration
     	inlineConstants = value;
     }
 
+    //
+    // 'js-getter-prefix'
+    //
+
+    protected String jsGetterPrefix = "";
+
+    public String getJsGetterPrefix()
+    {
+        return jsGetterPrefix;
+    }
+
+    @Config
+    @Mapping("js-getter-prefix")
+    public void setJsGetterPrefix(ConfigurationValue cv, String value)
+            throws ConfigurationException
+    {
+        jsGetterPrefix = value;
+    }
+
+    //
+    // 'js-setter-prefix'
+    //
+
+    protected String jsSetterPrefix = "";
+
+    public String getJsSetterPrefix()
+    {
+        return jsSetterPrefix;
+    }
+
+    @Config
+    @Mapping("js-setter-prefix")
+    public void setJsSetterPrefix(ConfigurationValue cv, String value)
+            throws ConfigurationException
+    {
+        jsSetterPrefix = value;
+    }
+
 }