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()