flip default to not emit coercions, even for function casting
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/17d59a94 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/17d59a94 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/17d59a94 Branch: refs/heads/develop Commit: 17d59a948adb75b39a4146f17cd7fcab9f3a7b4b Parents: a61d906 Author: Alex Harui <[email protected]> Authored: Fri Jan 8 14:29:41 2016 -0800 Committer: Alex Harui <[email protected]> Committed: Fri Jan 8 14:29:41 2016 -0800 ---------------------------------------------------------------------- .../codegen/js/flexjs/JSFlexJSDocEmitter.java | 34 ++++++------- .../js/flexjs/JSFlexJSEmitterTokens.java | 2 +- .../internal/codegen/js/jx/AsIsEmitter.java | 52 +++++++++++++------- 3 files changed, 52 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/17d59a94/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java index 11a6518..5dc097b 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java @@ -48,7 +48,7 @@ import org.apache.flex.compiler.tree.as.IVariableNode; public class JSFlexJSDocEmitter extends JSGoogDocEmitter { private List<String> classIgnoreList; - private List<String> ignoreList; + private List<String> coercionList; public JSFlexJSDocEmitter(IJSEmitter emitter) { @@ -68,9 +68,9 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter @Override protected String convertASTypeToJS(String name, String pname) { - if (ignoreList != null) + if (coercionList != null) { - if (ignoreList.contains(pname + "." + name)) + if (!coercionList.contains(pname + "." + name)) return IASLanguageConstants.Object; } if (classIgnoreList != null) @@ -94,7 +94,7 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter @Override public void emitMethodDoc(IFunctionNode node, ICompilerProject project) { - ignoreList = null; + coercionList = null; IClassDefinition classDefinition = resolveClassDefinition(node); @@ -152,10 +152,10 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter if (asDoc != null && MXMLJSC.keepASDoc) { String docText = asDoc.commentNoEnd(); - String ignoreToken = JSFlexJSEmitterTokens.IGNORE_COERCION + String keepToken = JSFlexJSEmitterTokens.EMIT_COERCION .getToken(); - if (docText.contains(ignoreToken)) - loadIgnores(docText); + if (docText.contains(keepToken)) + loadKeepers(docText); write(changeAnnotations(asDoc.commentNoEnd())); } else @@ -242,19 +242,19 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter } } - private void loadIgnores(String doc) + private void loadKeepers(String doc) { - ignoreList = new ArrayList<String>(); - String ignoreToken = JSFlexJSEmitterTokens.IGNORE_COERCION.getToken(); - int index = doc.indexOf(ignoreToken); + coercionList = new ArrayList<String>(); + String keepToken = JSFlexJSEmitterTokens.EMIT_COERCION.getToken(); + int index = doc.indexOf(keepToken); while (index != -1) { - String ignorable = doc.substring(index + ignoreToken.length()); - int endIndex = ignorable.indexOf("\n"); - ignorable = ignorable.substring(0, endIndex); - ignorable = ignorable.trim(); - ignoreList.add(ignorable); - index = doc.indexOf(ignoreToken, index + endIndex); + String keeper = doc.substring(index + keepToken.length()); + int endIndex = keeper.indexOf("\n"); + keeper = keeper.substring(0, endIndex); + keeper = keeper.trim(); + coercionList.add(keeper); + index = doc.indexOf(keepToken, index + endIndex); } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/17d59a94/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java index e9db7db..a09c9ab 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java @@ -34,7 +34,7 @@ public enum JSFlexJSEmitterTokens implements IEmitterTokens NAMES("names"), QNAME("qName"), UNDERSCORE("_"), - IGNORE_COERCION("@flexjsignorecoercion"), + EMIT_COERCION("@flexjsemitcoercion"), IGNORE_IMPORT("@flexjsignoreimport"), PREINCREMENT("preincrement"), PREDECREMENT("predecrement"), http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/17d59a94/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java index 540f558..b821d7a 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java @@ -29,6 +29,7 @@ import org.apache.flex.compiler.internal.definitions.ClassDefinition; import org.apache.flex.compiler.internal.projects.FlexJSProject; import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.tree.ASTNodeID; +import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IFunctionNode; @@ -49,6 +50,7 @@ public class AsIsEmitter extends JSSubEmitter .resolve(getProject()) : null; if (id != ASTNodeID.Op_IsID && dnode != null) { + boolean emit = false; // find the function node IFunctionNode functionNode = (IFunctionNode) left .getAncestorOfType(IFunctionNode.class); @@ -59,32 +61,46 @@ public class AsIsEmitter extends JSSubEmitter if (asDoc != null) { String asDocString = asDoc.commentNoEnd(); - String ignoreToken = JSFlexJSEmitterTokens.IGNORE_COERCION + String coercionToken = JSFlexJSEmitterTokens.EMIT_COERCION .getToken(); - boolean ignore = false; - int ignoreIndex = asDocString.indexOf(ignoreToken); - while (ignoreIndex != -1) + int emitIndex = asDocString.indexOf(coercionToken); + while (emitIndex != -1) { - String ignorable = asDocString.substring(ignoreIndex - + ignoreToken.length()); - int endIndex = ignorable.indexOf("\n"); - ignorable = ignorable.substring(0, endIndex); - ignorable = ignorable.trim(); + String emitable = asDocString.substring(emitIndex + + coercionToken.length()); + int endIndex = emitable.indexOf("\n"); + emitable = emitable.substring(0, endIndex); + emitable = emitable.trim(); String rightSide = dnode.getQualifiedName(); - if (ignorable.equals(rightSide)) + if (emitable.equals(rightSide)) { - ignore = true; + emit = true; break; } - ignoreIndex = asDocString.indexOf(ignoreToken, - ignoreIndex + ignoreToken.length()); - } - if (ignore) - { - getWalker().walk(left); - return; + emitIndex = asDocString.indexOf(coercionToken, + emitIndex + coercionToken.length()); } } + if (coercion) + { + // see if the cast is inside a try/catch in this function. If so, + // assume that we want an exception. + IASNode child = left.getParent(); + while (child != functionNode) + { + if (child.getNodeID() == ASTNodeID.TryID) + { + emit = true; + break; + } + child = child.getParent(); + } + } + } + if (!emit) + { + getWalker().walk(left); + return; } }
