Fix logic for setting variations of royalesuppresscompleximplicitcoercion. Added supporting compiler tests.
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
index a60ffbc..d6a9745 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
@@ -775,8 +775,14 @@
{
JSRoyaleDocEmitter royaleDocEmitter = (JSRoyaleDocEmitter) docEmitter;
//check for local toggle
- needsCoercion = royaleDocEmitter.getLocalSettingAsBoolean(
- JSRoyaleEmitterTokens.SUPPRESS_COMPLEX_IMPLICIT_COERCION, needsCoercion);
+ if (needsCoercion) needsCoercion = !(royaleDocEmitter.getLocalSettingAsBoolean(
+ JSRoyaleEmitterTokens.SUPPRESS_COMPLEX_IMPLICIT_COERCION, false));
+ else {
+ if (royaleDocEmitter.hasLocalSetting(JSRoyaleEmitterTokens.SUPPRESS_COMPLEX_IMPLICIT_COERCION.getToken())) {
+ needsCoercion = !(royaleDocEmitter.getLocalSettingAsBoolean(
+ JSRoyaleEmitterTokens.SUPPRESS_COMPLEX_IMPLICIT_COERCION, false));
+ }
+ }
if (needsCoercion) {
//check for individual specified suppression
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java
index e32b148..2d8379c 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java
@@ -351,9 +351,6 @@
}
}
- /**
- *
- */
private void loadLocalSettings(String doc, String settingToken, String defaultSetting)
{
if (localSettings == null) localSettings = new HashMap<String, List<String>>();
@@ -383,8 +380,7 @@
settings.add(settingItem);
//System.out.println("---Adding setting "+settingToken+":"+settingItem);
}
-
- index = doc.indexOf(settingToken, index + endIndex);
+ index = doc.indexOf(settingToken, index + settingToken.length());
}
}
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
index 48ec475..8ee8ab9 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
@@ -1552,6 +1552,71 @@
asBlockWalker.visitFunction(node);
assertOut("/**\n * @export\n * @param {Object} o\n * @return {number}\n */\nfoo.bar.B.prototype.b = function(o) {\n var /** @type {foo.bar.B} */ a = null;\n a = /* implicit cast */ org.apache.royale.utils.Language.as(org.apache.royale.utils.Language.as(o, this.memberVar), foo.bar.B, true);\n}");
}
+
+ @Test
+ public void testVisitAsMemberVariableSuppressComplexImplicitCoercionA()
+ {
+ IFunctionNode node = (IFunctionNode) getNode(
+ "public class B {private var memberVar:Class; /**\n * @royalesuppresscompleximplicitcoercion\n */\n public function b(o:Object):int { var a:B = null; a = o as memberVar; }}",
+ IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+ asBlockWalker.visitFunction(node);
+ assertOut("/**\n * @royalesuppresscompleximplicitcoercion\n * @export\n * @param {Object} o\n * @return {number}\n */\nfoo.bar.B.prototype.b = function(o) {\n var /** @type {foo.bar.B} */ a = null;\n a = org.apache.royale.utils.Language.as(o, this.memberVar);\n}");
+ }
+
+ @Test
+ public void testVisitAsMemberVariableSuppressComplexImplicitCoercionB()
+ {
+ IFunctionNode node = (IFunctionNode) getNode(
+ "public class B {private var memberVar:Class; /**\n * @royalesuppresscompleximplicitcoercion true\n */\n public function b(o:Object):int { var a:B = null; a = o as memberVar; }}",
+ IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+ asBlockWalker.visitFunction(node);
+ assertOut("/**\n * @royalesuppresscompleximplicitcoercion true\n * @export\n * @param {Object} o\n * @return {number}\n */\nfoo.bar.B.prototype.b = function(o) {\n var /** @type {foo.bar.B} */ a = null;\n a = org.apache.royale.utils.Language.as(o, this.memberVar);\n}");
+ }
+
+ @Test
+ public void testVisitAsMemberVariableSuppressComplexImplicitCoercionC()
+ {
+ IFunctionNode node = (IFunctionNode) getNode(
+ "public class B {private var memberVar:Class; /**\n * @royalesuppresscompleximplicitcoercion foo.bar.B\n */\n public function b(o:Object):int { var a:B = null; a = o as memberVar; }}",
+ IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+ asBlockWalker.visitFunction(node);
+ assertOut("/**\n * @royalesuppresscompleximplicitcoercion foo.bar.B\n * @export\n * @param {Object} o\n * @return {number}\n */\nfoo.bar.B.prototype.b = function(o) {\n var /** @type {foo.bar.B} */ a = null;\n a = org.apache.royale.utils.Language.as(o, this.memberVar);\n}");
+ }
+
+
+ @Test
+ public void testVisitAsMemberVariableSuppressComplexImplicitCoercionD()
+ {
+ //using config level setting to suppress the output by default
+ try{
+ project.config.setJsComplexImplicitCoercions(null,false);
+ } catch (ConfigurationException e) {
+ e.printStackTrace();
+ }
+
+ IFunctionNode node = (IFunctionNode) getNode(
+ "public class B {private var memberVar:Class; public function b(o:Object):int { var a:B = null; a = o as memberVar; }}",
+ IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+ asBlockWalker.visitFunction(node);
+ assertOut("/**\n * @export\n * @param {Object} o\n * @return {number}\n */\nfoo.bar.B.prototype.b = function(o) {\n var /** @type {foo.bar.B} */ a = null;\n a = org.apache.royale.utils.Language.as(o, this.memberVar);\n}");
+ }
+
+ @Test
+ public void testVisitAsMemberVariableSuppressComplexImplicitCoercionE()
+ {
+ //using config level setting to suppress the output by default
+ try{
+ project.config.setJsComplexImplicitCoercions(null,false);
+ } catch (ConfigurationException e) {
+ e.printStackTrace();
+ }
+ //reverse the config level suppression (with 'false')
+ IFunctionNode node = (IFunctionNode) getNode(
+ "public class B {private var memberVar:Class; /**\n * @royalesuppresscompleximplicitcoercion false\n */\n public function b(o:Object):int { var a:B = null; a = o as memberVar; }}",
+ IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+ asBlockWalker.visitFunction(node);
+ assertOut("/**\n * @royalesuppresscompleximplicitcoercion false\n * @export\n * @param {Object} o\n * @return {number}\n */\nfoo.bar.B.prototype.b = function(o) {\n var /** @type {foo.bar.B} */ a = null;\n a = /* implicit cast */ org.apache.royale.utils.Language.as(org.apache.royale.utils.Language.as(o, this.memberVar), foo.bar.B, true);\n}");
+ }
@Test
public void testVisitJSDoc()