I plan to do some more work on this in August. It's not quite ready yet. -- Josh Tynjala Bowler Hat LLC <https://bowlerhat.dev>
On Fri, Jul 26, 2024 at 5:22 AM Harbs <harbs.li...@gmail.com> wrote: > Josh, it looks like you did some work on source map names. Is there > something ready to test yet? > > Thanks, > Harbs > > > On Jul 25, 2024, at 8:14 PM, joshtynj...@apache.org wrote: > > > > 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 > > > > commit 16db787e6048324cd40911fbe097d989a6f86d1d > > Author: Josh Tynjala <joshtynj...@apache.org> > > AuthorDate: Thu Jul 25 09:23:42 2024 -0700 > > > > compiler-jx: source map improvements > > > > added original symbol name to field and method definition, if > applicable > > added mappings for default parameter value initialization > > improved mappings for field and method definitions > > added original symbol name to identifiers, if applicable > > --- > > .../compiler/codegen/js/IMappingEmitter.java | 16 +++++ > > .../compiler/internal/codegen/js/JSEmitter.java | 65 > +++++++++++++-------- > > .../compiler/internal/codegen/js/JSSubEmitter.java | 15 +++++ > > .../internal/codegen/js/jx/FieldEmitter.java | 57 > ++++++++++++++---- > > .../internal/codegen/js/jx/IdentifierEmitter.java | 64 > +++++++++++++------- > > .../internal/codegen/js/jx/MethodEmitter.java | 7 ++- > > .../codegen/js/royale/JSRoyaleEmitter.java | 68 > +++++++++++++--------- > > .../codegen/mxml/royale/MXMLRoyaleEmitter.java | 39 +++++++++---- > > .../royale/compiler/utils/SourceMapUtils.java | 2 +- > > .../js/sourcemaps/TestSourceMapFieldMembers.java | 51 ++++++++++------ > > .../js/sourcemaps/TestSourceMapMethodMembers.java | 48 +++++++++++++++ > > .../compiler/internal/test/SourceMapTestBase.java | 35 ++++++++++- > > 12 files changed, 348 insertions(+), 119 deletions(-) > > > > diff --git > a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IMappingEmitter.java > b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IMappingEmitter.java > > index bcc575747..6e5dee410 100644 > > --- > a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IMappingEmitter.java > > +++ > b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/IMappingEmitter.java > > @@ -37,6 +37,11 @@ public interface IMappingEmitter > > */ > > void startMapping(ISourceLocation node); > > > > + /** > > + * Adds a node to the source map using a custom symbol name. > > + */ > > + void startMapping(ISourceLocation node, String symbolName); > > + > > /** > > * Adds a node to the source map using custom line and column values, > > * instead of the node's own line and column. Useful for starting a > mapping > > @@ -50,6 +55,17 @@ public interface IMappingEmitter > > */ > > void startMapping(ISourceLocation node, ISourceLocation afterNode); > > > > + /** > > + * Adds a node the the source map using a custom symbol name, and > custom > > + * line and column values. > > + */ > > + void startMapping(ISourceLocation node, String symbolName, int > line, int column); > > + > > + /** > > + * Adds to the source map, without a node. > > + */ > > + void startMapping(String sourcePath, String symbolName, int line, > int column); > > + > > /** > > * Commits a mapping to the source map. > > */ > > 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 85f069c5e..b534c2783 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 > > @@ -384,18 +384,57 @@ public class JSEmitter extends ASEmitter > implements IJSEmitter > > { > > startMapping(node, node.getLine(), node.getColumn()); > > } > > + > > + public void startMapping(ISourceLocation node, String symbolName) > > + { > > + startMapping(node, symbolName, node.getLine(), > node.getColumn()); > > + } > > > > public void startMapping(ISourceLocation node, int line, int column) > > + { > > + startMapping(node, null, line, column); > > + } > > + > > + public void startMapping(ISourceLocation node, ISourceLocation > afterNode) > > + { > > + startMapping(node, afterNode.getEndLine(), > afterNode.getEndColumn()); > > + } > > + > > + public void startMapping(ISourceLocation node, String symbolName, > int line, int column) > > + { > > + String sourcePath = node.getSourcePath(); > > + if (sourcePath == null) > > + { > > + //if the source path is null, this node may have been > generated by > > + //the compiler automatically. for example, an untyped > variable will > > + //have a node for the * type. > > + if (node instanceof IASNode) > > + { > > + IASNode parentNode = ((IASNode) node).getParent(); > > + if (parentNode != null) > > + { > > + //try the parent node > > + startMapping(parentNode, symbolName, line, column); > > + return; > > + } > > + } > > + } > > + > > + startMapping(sourcePath, symbolName, line, column); > > + } > > + > > + public void startMapping(String sourcePath, String symbolName, int > line, int column) > > { > > if (isBufferWrite()) > > { > > return; > > } > > + > > IEmitter parentEmitter = getParentEmitter(); > > if (parentEmitter != null && parentEmitter instanceof > IMappingEmitter) > > { > > IMappingEmitter mappingParent = (IMappingEmitter) > parentEmitter; > > - mappingParent.startMapping(node, line, column); > > + mappingParent.startMapping(sourcePath, symbolName, line, > column); > > return; > > } > > if (lastMapping != null) > > @@ -407,39 +446,17 @@ public class JSEmitter extends ASEmitter > implements IJSEmitter > > + " in file " + lastMapping.sourcePath); > > } > > > > - String sourcePath = node.getSourcePath(); > > - if (sourcePath == null) > > - { > > - //if the source path is null, this node may have been > generated by > > - //the compiler automatically. for example, an untyped > variable will > > - //have a node for the * type. > > - if (node instanceof IASNode) > > - { > > - IASNode parentNode = ((IASNode) node).getParent(); > > - if (parentNode != null) > > - { > > - //try the parent node > > - startMapping(parentNode, line, column); > > - return; > > - } > > - } > > - } > > - > > //prefer forward slash > > sourcePath = sourcePath.replace('\\', '/'); > > > > SourceMapMapping mapping = new SourceMapMapping(); > > mapping.sourcePath = sourcePath; > > + mapping.name = symbolName; > > mapping.sourceStartPosition = new FilePosition(line, column); > > mapping.destStartPosition = new FilePosition(getCurrentLine(), > getCurrentColumn()); > > lastMapping = mapping; > > } > > > > - public void startMapping(ISourceLocation node, ISourceLocation > afterNode) > > - { > > - startMapping(node, afterNode.getEndLine(), > afterNode.getEndColumn()); > > - } > > - > > public void endMapping(ISourceLocation node) > > { > > if (isBufferWrite()) > > diff --git > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSubEmitter.java > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSubEmitter.java > > index 6e347bdae..013381934 100644 > > --- > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSubEmitter.java > > +++ > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSSubEmitter.java > > @@ -114,11 +114,26 @@ public class JSSubEmitter > > emitter.startMapping(node); > > } > > > > + protected void startMapping(ISourceLocation node, String sourcePath) > > + { > > + emitter.startMapping(node, sourcePath); > > + } > > + > > protected void startMapping(ISourceLocation node, int line, int > column) > > { > > emitter.startMapping(node, line, column); > > } > > > > + protected void startMapping(ISourceLocation node, String > symbolName, int line, int column) > > + { > > + emitter.startMapping(node, symbolName, line, column); > > + } > > + > > + protected void startMapping(String sourcePath, String symbolName, > int line, int column) > > + { > > + emitter.startMapping(sourcePath, symbolName, line, column); > > + } > > + > > protected void startMapping(ISourceLocation node, ISourceLocation > afterNode) > > { > > emitter.startMapping(node, afterNode); > > 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 6db4a849c..da0f83db8 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 > > @@ -125,6 +125,7 @@ public class FieldEmitter extends JSSubEmitter > implements > > { > > def = enode.resolveType(getProject()); > > } > > + IExpressionNode nameNode = node.getNameExpressionNode(); > > > > // TODO (mschmalle) > > if (getEmitter().getDocEmitter() instanceof IJSRoyaleDocEmitter > && !isComplexInitializedStatic) > > @@ -159,7 +160,6 @@ public class FieldEmitter extends JSSubEmitter > implements > > if (definition == null) > > definition = ndef.getContainingScope().getDefinition(); > > > > - startMapping(node.getNameExpressionNode()); > > className = > getEmitter().formatQualifiedName(definition.getQualifiedName()); > > if (isComplexInitializedStatic) > > { > > @@ -167,22 +167,40 @@ public class FieldEmitter extends JSSubEmitter > implements > > } > > else > > { > > - write(className > > - + ASEmitterTokens.MEMBER_ACCESS.getToken() + > root); > > - String qname = node.getName(); > > + startMapping(nameNode); > > + write(className); > > + write(ASEmitterTokens.MEMBER_ACCESS.getToken()); > > + write(root); > > + endMapping(nameNode); > > + String nodeName = node.getName(); > > + String qname = nodeName; > > IDefinition nodeDef = node.getDefinition(); > > if (nodeDef != null && !nodeDef.isStatic() && > nodeDef.isPrivate() && getProject().getAllowPrivateNameConflicts()) > > - qname = > getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), > qname); > > + { > > + qname = > getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), > qname); > > + } > > > > - if > (EmitterUtils.isCustomNamespace(node.getNamespace())) { > > + if > (EmitterUtils.isCustomNamespace(node.getNamespace())) > > + { > > INamespaceDecorationNode ns = ((VariableNode) > node).getNamespaceNode(); > > INamespaceDefinition nsDef = > (INamespaceDefinition)ns.resolve(getProject()); > > fjs.formatQualifiedName(nsDef.getQualifiedName()); > // register with used names > > String s = nsDef.getURI(); > > + startMapping(nameNode, node.getName()); > > write(JSRoyaleEmitter.formatNamespacedProperty(s, > qname, false)); > > + endMapping(nameNode); > > } > > - else write(qname); > > - endMapping(node.getNameExpressionNode()); > > + else > > + { > > + String symbolName = null; > > + if (!qname.equals(nodeName)) > > + { > > + symbolName = nodeName; > > + } > > + startMapping(nameNode, symbolName); > > + write(qname); > > + endMapping(nameNode); > > + } > > } > > } > > > > @@ -236,10 +254,10 @@ public class FieldEmitter extends JSSubEmitter > implements > > (!ndef.isStatic() && > EmitterUtils.isScalar(vnode)) || > > isPackageOrFileMember) > > { > > - IExpressionNode beforeNode = node.getVariableTypeNode(); > > + IExpressionNode beforeNode = enode; > > if (beforeNode.getAbsoluteStart() == -1) > > { > > - beforeNode = node.getNameExpressionNode(); > > + beforeNode = nameNode; > > } > > startMapping(node, beforeNode); > > write(ASEmitterTokens.SPACE); > > @@ -371,10 +389,10 @@ public class FieldEmitter extends JSSubEmitter > implements > > private void emitComplexInitializedStatic(IVariableNode node, String > className, IDefinition variableTypeExprDef) { > > JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter(); > > IExpressionNode vnode = node.getAssignedValueNode(); > > + IExpressionNode nameNode = node.getNameExpressionNode(); > > write(className); > > write(ASEmitterTokens.MEMBER_ACCESS.getToken()); > > write(fjs.formatGetter(getFieldName(node, fjs))); > > - endMapping(node.getNameExpressionNode()); > > write(ASEmitterTokens.SPACE); > > writeToken(ASEmitterTokens.EQUAL); > > write(ASEmitterTokens.FUNCTION); > > @@ -385,7 +403,9 @@ public class FieldEmitter extends JSSubEmitter > implements > > writeToken(ASEmitterTokens.VAR); > > writeToken("value"); > > writeToken(ASEmitterTokens.EQUAL); > > + startMapping(vnode); > > write(vnodeString); > > + endMapping(vnode); > > writeNewline(ASEmitterTokens.SEMICOLON); > > write(IASLanguageConstants.Object); > > write(ASEmitterTokens.MEMBER_ACCESS); > > @@ -444,10 +464,23 @@ public class FieldEmitter extends JSSubEmitter > implements > > { > > ((IJSRoyaleDocEmitter) > getEmitter().getDocEmitter()).emitFieldDoc(node, variableTypeExprDef, > getProject()); > > } > > + startMapping(node); > > write(className); > > write(ASEmitterTokens.MEMBER_ACCESS); > > - write(getFieldName(node, fjs)); > > + endMapping(node); > > + String symbolName = null; > > + String nodeName = node.getName(); > > + String fieldName = getFieldName(node, fjs); > > + if (!fieldName.equals(nodeName)) > > + { > > + symbolName = nodeName; > > + } > > + startMapping(nameNode, symbolName); > > + write(fieldName); > > + endMapping(nameNode); > > + startMapping(node); > > write(ASEmitterTokens.SEMICOLON); > > + endMapping(node); > > writeNewline(); > > writeNewline(); > > write(IASLanguageConstants.Object); > > diff --git > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java > > index bf41d0648..cab686677 100644 > > --- > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java > > +++ > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/IdentifierEmitter.java > > @@ -102,27 +102,14 @@ public class IdentifierEmitter extends > JSSubEmitter implements > > { > > return; > > } > > - IASNode prevSibling = parentNode.getChild(0); > > - if(prevSibling == node) > > - { > > - startMapping(parentNode); > > - } > > - else > > - { > > - startMapping(prevSibling); > > - } > > + startMapping(node); > > write(getEmitter().formatQualifiedName(sname)); > > - if(prevSibling != node) > > + if (!isCustomNamespace) > > { > > - endMapping(prevSibling); > > - startMapping(parentNode, prevSibling); > > - } > > - if (!isCustomNamespace) { > > write(ASEmitterTokens.MEMBER_ACCESS); > > wroteMemberAccess = true; > > } > > - > > - endMapping(parentNode); > > + endMapping(node); > > } > > } > > else if (!NativeUtils.isNative(node.getName())) > > @@ -162,7 +149,9 @@ public class IdentifierEmitter extends JSSubEmitter > implements > > wroteSelf = true; > > } > > else > > + { > > write(ASEmitterTokens.THIS); > > + } > > > > if (!isCustomNamespace) { > > write(ASEmitterTokens.MEMBER_ACCESS); > > @@ -172,7 +161,9 @@ public class IdentifierEmitter extends JSSubEmitter > implements > > } > > else if (EmitterUtils.writeE4xFilterNode(getProject(), > getModel(), node)) > > { > > + startMapping(node); > > write("node."); > > + endMapping(node); > > } > > > > if (generateClosure) > > @@ -189,7 +180,9 @@ public class IdentifierEmitter extends JSSubEmitter > implements > > { > > String qname = node.getName(); > > if (nodeDef != null && !isStatic && (!(nodeDef > instanceof IParameterDefinition)) && nodeDef.isPrivate() && > getProject().getAllowPrivateNameConflicts()) > > + { > > qname = > getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), > qname); > > + } > > write(qname); > > } > > > > @@ -256,55 +249,82 @@ public class IdentifierEmitter extends > JSSubEmitter implements > > //member access expression, it shouldn't be fully > qualified > > needsFormattedName = > parentMemberAccessNode.getLeftOperandNode() == node; > > } > > - startMapping(node); > > if (parentNodeId == ASTNodeID.MemberAccessExpressionID) > > { > > if (needsFormattedName) > > { > > + startMapping(node); > > write(getEmitter().formatQualifiedName(qname)); > > + endMapping(node); > > } > > else if (isCustomNamespace) > > { > > String ns = > ((INamespaceResolvedReference)(nodeDef.getNamespaceReference())).resolveAETNamespace(getProject()).getName(); > > + startMapping(node, node.getName()); > > write(JSRoyaleEmitter.formatNamespacedProperty(ns, > qname, accessWithNS)); > > + endMapping(node); > > } > > else > > { > > - if (!(nodeDef.getParent() instanceof > IPackageDefinition)) { > > + if (!(nodeDef.getParent() instanceof > IPackageDefinition)) > > + { > > qname = node.getName(); > > if (nodeDef != null && !isStatic && > (nodeDef.getParent() instanceof ClassDefinition) && (!(nodeDef instanceof > IParameterDefinition)) && nodeDef.isPrivate() && > getProject().getAllowPrivateNameConflicts()) > > + { > > qname = > getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), > qname); > > + } > > } > > + startMapping(node); > > write(qname); > > + endMapping(node); > > } > > } > > else if (isPackageOrFileMember) > > + { > > + startMapping(node); > > write(getEmitter().formatQualifiedName(qname)); > > + endMapping(node); > > + } > > else if (nodeDef instanceof TypeDefinitionBase) > > { > > - if (NativeUtils.isSyntheticJSType(qname) && > !(parentNode instanceof IFunctionCallNode)) { > > + if (NativeUtils.isSyntheticJSType(qname) && > !(parentNode instanceof IFunctionCallNode)) > > + { > > getEmitter().getModel().needLanguage = true; > > write(JSRoyaleEmitterTokens.SYNTH_TYPE); > > write(ASEmitterTokens.PAREN_OPEN); > > write(ASEmitterTokens.SINGLE_QUOTE); > > + startMapping(node); > > write(getEmitter().formatQualifiedName(qname)); > > + endMapping(node); > > write(ASEmitterTokens.SINGLE_QUOTE); > > write(ASEmitterTokens.PAREN_CLOSE); > > } > > - else write(getEmitter().formatQualifiedName(qname)); > > + else > > + { > > + startMapping(node); > > + write(getEmitter().formatQualifiedName(qname)); > > + endMapping(node); > > + } > > } > > else if (isCustomNamespace) > > { > > String ns = > ((INamespaceResolvedReference)nodeDef.getNamespaceReference()).resolveAETNamespace(getProject()).getName(); > > + startMapping(node, node.getName()); > > write(JSRoyaleEmitter.formatNamespacedProperty(ns, > qname, accessWithNS)); > > + endMapping(node); > > } > > else > > { > > + String originalSymbolName = null; > > if (nodeDef != null && !isStatic && > (nodeDef.getParent() instanceof ClassDefinition) && (!(nodeDef instanceof > IParameterDefinition)) && nodeDef.isPrivate() && > getProject().getAllowPrivateNameConflicts()) > > - qname = > getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), > qname); > > + { > > + qname = > getEmitter().formatPrivateName(nodeDef.getParent().getQualifiedName(), > qname); > > + originalSymbolName = node.getName(); > > + } > > + startMapping(node, originalSymbolName, > node.getLine(), node.getColumn()); > > write(qname); > > + endMapping(node); > > } > > - endMapping(node); > > } > > else if (getModel().inE4xFilter && > EmitterUtils.writeE4xFilterNode(getProject(), getModel(), node) /* swapped > this out to allow for deeper nesting inside the filter expression ... > instead of original:grandparentNodeId == ASTNodeID.E4XFilterID*/ > > && (!(parentNodeId == > ASTNodeID.MemberAccessExpressionID > > diff --git > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java > > index 3e470cf96..719a96b65 100644 > > --- > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java > > +++ > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java > > @@ -39,6 +39,7 @@ import > org.apache.royale.compiler.internal.tree.as.FunctionNode; > > import org.apache.royale.compiler.problems.ICompilerProblem; > > import org.apache.royale.compiler.projects.ICompilerProject; > > import org.apache.royale.compiler.tree.as.IClassNode; > > +import org.apache.royale.compiler.tree.as.IExpressionNode; > > import org.apache.royale.compiler.tree.as.IFunctionNode; > > import org.apache.royale.utils.ASTUtil; > > > > @@ -75,6 +76,8 @@ public class MethodEmitter extends JSSubEmitter > implements > > && isConstructor > > && > getModel().getImplicitBindableImplementation() == > ImplicitBindableImplementation.EXTENDS; > > > > + IExpressionNode nameNode = fn.getNameExpressionNode(); > > + > > String qname = null; > > IFunctionDefinition.FunctionClassification classification = > fn.getFunctionClassification(); > > if(classification == > IFunctionDefinition.FunctionClassification.FILE_MEMBER || > > @@ -89,7 +92,7 @@ public class MethodEmitter extends JSSubEmitter > implements > > } > > else > > { > > - startMapping(node.getNameExpressionNode()); > > + startMapping(nameNode); > > ITypeDefinition typeDef = > EmitterUtils.getTypeDefinition(node); > > if (typeDef != null) > > { > > @@ -113,11 +116,11 @@ public class MethodEmitter extends JSSubEmitter > implements > > write(ASEmitterTokens.MEMBER_ACCESS); > > } > > } > > + endMapping(nameNode); > > if (!isConstructor) > > { > > fjs.emitMemberName(node); > > } > > - endMapping(node.getNameExpressionNode()); > > } > > if (node.getMetaTags() != null) { > > //offset mapping by any metadata tags that will be in the > first child node > > 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 72ea28a8f..a7bd7ce69 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 > > @@ -583,8 +583,6 @@ public class JSRoyaleEmitter extends JSEmitter > implements IJSRoyaleEmitter > > > > if (defaults != null) > > { > > - final StringBuilder code = new StringBuilder(); > > - > > if (!EmitterUtils.hasBody(node)) > > { > > indentPush(); > > @@ -600,35 +598,41 @@ public class JSRoyaleEmitter extends JSEmitter > implements IJSRoyaleEmitter > > > > if (pnode != null) > > { > > - code.setLength(0); > > - > > /* x = typeof y !== 'undefined' ? y : z;\n */ > > - code.append(pnode.getName()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - code.append(ASEmitterTokens.EQUAL.getToken()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - code.append(ASEmitterTokens.TYPEOF.getToken()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - code.append(pnode.getName()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - > code.append(ASEmitterTokens.STRICT_NOT_EQUAL.getToken()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - > code.append(ASEmitterTokens.SINGLE_QUOTE.getToken()); > > - code.append(ASEmitterTokens.UNDEFINED.getToken()); > > - > code.append(ASEmitterTokens.SINGLE_QUOTE.getToken()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - code.append(ASEmitterTokens.TERNARY.getToken()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - code.append(pnode.getName()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > - code.append(ASEmitterTokens.COLON.getToken()); > > - code.append(ASEmitterTokens.SPACE.getToken()); > > + startMapping(pnode); > > + write(pnode.getName()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(ASEmitterTokens.EQUAL.getToken()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(ASEmitterTokens.TYPEOF.getToken()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(pnode.getName()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(ASEmitterTokens.STRICT_NOT_EQUAL.getToken()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(ASEmitterTokens.SINGLE_QUOTE.getToken()); > > + write(ASEmitterTokens.UNDEFINED.getToken()); > > + write(ASEmitterTokens.SINGLE_QUOTE.getToken()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(ASEmitterTokens.TERNARY.getToken()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(pnode.getName()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + write(ASEmitterTokens.COLON.getToken()); > > + write(ASEmitterTokens.SPACE.getToken()); > > + endMapping(pnode); > > > > IExpressionNode assignedValueNode = > pnode.getAssignedValueNode(); > > - code.append(stringifyNode(assignedValueNode)); > > - code.append(ASEmitterTokens.SEMICOLON.getToken()); > > + if (assignedValueNode != null) > > + { > > + startMapping(assignedValueNode); > > + write(stringifyNode(assignedValueNode)); > > + endMapping(assignedValueNode); > > + } > > > > - write(code.toString()); > > + startMapping(pnode); > > + write(ASEmitterTokens.SEMICOLON.getToken()); > > + endMapping(pnode); > > > > if (i == n - 1 && !EmitterUtils.hasBody(node)) > > indentPop(); > > @@ -859,6 +863,7 @@ public class JSRoyaleEmitter extends JSEmitter > implements IJSRoyaleEmitter > > public void emitMemberName(IDefinitionNode node) > > { > > ICompilerProject project = getWalker().getProject(); > > + IExpressionNode nameNode = node.getNameExpressionNode(); > > if (node.getNodeID() == ASTNodeID.FunctionID) > > { > > FunctionNode fn = (FunctionNode)node; > > @@ -868,15 +873,24 @@ public class JSRoyaleEmitter extends JSEmitter > implements IJSRoyaleEmitter > > INamespaceDefinition nsDef = > (INamespaceDefinition)ns.resolve(project); > > formatQualifiedName(nsDef.getQualifiedName()); // > register with used names > > String s = nsDef.getURI(); > > + startMapping(nameNode, node.getName()); > > write(formatNamespacedProperty(s, node.getName(), true)); > > + endMapping(nameNode); > > return; > > } > > } > > + String symbolName = null; > > String qname = node.getName(); > > IDefinition nodeDef = node.getDefinition(); > > if (nodeDef != null && !nodeDef.isStatic() && > nodeDef.isPrivate() && project.getAllowPrivateNameConflicts()) > > + { > > qname = > formatPrivateName(nodeDef.getParent().getQualifiedName(), qname); > > + symbolName = node.getName(); > > + } > > + > > + startMapping(nameNode, symbolName); > > write(qname); > > + endMapping(nameNode); > > } > > > > public static String formatNamespacedProperty(String s, String > propName, boolean access) { > > diff --git > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java > > index 55c3e0200..e357fb74a 100644 > > --- > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java > > +++ > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java > > @@ -685,21 +685,18 @@ public class MXMLRoyaleEmitter extends MXMLEmitter > implements > > startMapping(node, node.getLine(), node.getColumn()); > > } > > > > + public void startMapping(ISourceLocation node, String symbolName) > > + { > > + startMapping(node, symbolName, node.getLine(), > node.getColumn()); > > + } > > + > > public void startMapping(ISourceLocation node, int line, int column) > > { > > - if (isBufferWrite()) > > - { > > - return; > > - } > > - if (lastMapping != null) > > - { > > - FilePosition sourceStartPosition = > lastMapping.sourceStartPosition; > > - throw new IllegalStateException("Cannot start new mapping > when another mapping is already started. " > > - + "Previous mapping at Line " + > sourceStartPosition.getLine() > > - + " and Column " + sourceStartPosition.getColumn() > > - + " in file " + lastMapping.sourcePath); > > - } > > + startMapping(node, null, line, column); > > + } > > > > + public void startMapping(ISourceLocation node, String symbolName, > int line, int column) > > + { > > String sourcePath = node.getSourcePath(); > > if (sourcePath == null) > > { > > @@ -717,9 +714,27 @@ public class MXMLRoyaleEmitter extends MXMLEmitter > implements > > } > > } > > } > > + startMapping(sourcePath, symbolName, line, column); > > + } > > + > > + public void startMapping(String sourcePath, String symbolName, int > line, int column) > > + { > > + if (isBufferWrite()) > > + { > > + return; > > + } > > + if (lastMapping != null) > > + { > > + FilePosition sourceStartPosition = > lastMapping.sourceStartPosition; > > + throw new IllegalStateException("Cannot start new mapping > when another mapping is already started. " > > + + "Previous mapping at Line " + > sourceStartPosition.getLine() > > + + " and Column " + sourceStartPosition.getColumn() > > + + " in file " + lastMapping.sourcePath); > > + } > > > > SourceMapMapping mapping = new SourceMapMapping(); > > mapping.sourcePath = sourcePath; > > + mapping.name = symbolName; > > mapping.sourceStartPosition = new FilePosition(line, column); > > mapping.destStartPosition = new FilePosition(getCurrentLine(), > getCurrentColumn()); > > lastMapping = mapping; > > diff --git > a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/SourceMapUtils.java > b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/SourceMapUtils.java > > index ba2d9bb71..7af93ec80 100644 > > --- > a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/SourceMapUtils.java > > +++ > b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/SourceMapUtils.java > > @@ -205,7 +205,7 @@ public class SourceMapUtils > > //SourceMapGeneratorV3's appendTo() that omits the last > > //entry, for some reason > > FilePosition newEndPosition = new > FilePosition(endPosition.getLine(), endPosition.getColumn() + 1); > > - generator.addMapping(sourceName, null, > sourceStartPosition, endPosition, newEndPosition); > > + generator.addMapping(sourceName, symbolName, > sourceStartPosition, endPosition, newEndPosition); > > } > > > > private static class SourceMapEntryCounter implements > SourceMapConsumerV3.EntryVisitor > > diff --git > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java > > index 219f6f6c5..7c5455fb1 100644 > > --- > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java > > +++ > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapFieldMembers.java > > @@ -33,7 +33,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("var foo;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @type {*}\n */\nRoyaleTest_A.prototype.foo > > - assertMapping(node, 0, 4, 4, 0, 4, 26); // foo > > + assertMapping(node, 0, 4, 4, 0, 4, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 4, 4, 23, 4, 26); // foo > > } > > > > @Test > > @@ -42,7 +43,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("var foo:String = null;"); > > asBlockWalker.visitVariable(node); > > //**\n * @package\n * @type {string}\n > */\nRoyaleTest_A.prototype.foo = null > > - assertMapping(node, 0, 4, 4, 0, 4, 26); // foo > > + assertMapping(node, 0, 4, 4, 0, 4, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 4, 4, 23, 4, 26); // foo > > assertMapping(node, 0, 14, 4, 26, 4, 29); // = > > assertMapping(node, 0, 17, 4, 29, 4, 33); // null > > } > > @@ -53,7 +55,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("var foo:int;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @type {number}\n > */\nRoyaleTest_A.prototype.foo = 0 > > - assertMapping(node, 0, 4, 4, 0, 4, 26); // foo > > + assertMapping(node, 0, 4, 4, 0, 4, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 4, 4, 23, 4, 26); // foo > > } > > > > @Test > > @@ -62,7 +65,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("var foo = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @type {*}\n > */\nRoyaleTest_A.prototype.foo = 420 > > - assertMapping(node, 0, 4, 4, 0, 4, 26); // foo > > + assertMapping(node, 0, 4, 4, 0, 4, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 4, 4, 23, 4, 26); // foo > > assertMapping(node, 0, 7, 4, 26, 4, 29); // = > > assertMapping(node, 0, 10, 4, 29, 4, 32); // 420 > > } > > @@ -73,7 +77,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("var foo:int = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @type {number}\n > */\nRoyaleTest_A.prototype.foo = 420 > > - assertMapping(node, 0, 4, 4, 0, 4, 26); // foo > > + assertMapping(node, 0, 4, 4, 0, 4, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 4, 4, 23, 4, 26); // foo > > assertMapping(node, 0, 11, 4, 26, 4, 29); // = > > assertMapping(node, 0, 14, 4, 29, 4, 32); // 420 > > } > > @@ -84,7 +89,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static var foo;"); > > asBlockWalker.visitVariable(node); > > ////**\n * @package\n * @type {*}\n */\nRoyaleTest_A.foo > > - assertMapping(node, 0, 11, 4, 0, 4, 16); // foo > > + assertMapping(node, 0, 11, 4, 0, 4, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 11, 4, 13, 4, 16); // foo > > } > > > > @Test > > @@ -93,7 +99,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static var foo:int;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @type {number}\n */\nRoyaleTest_A.foo = 0 > > - assertMapping(node, 0, 11, 4, 0, 4, 16); // foo > > + assertMapping(node, 0, 11, 4, 0, 4, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 11, 4, 13, 4, 16); // foo > > } > > > > @Test > > @@ -102,7 +109,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static var foo = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @type {*}\n */\nRoyaleTest_A.foo = 420 > > - assertMapping(node, 0, 11, 4, 0, 4, 16); // foo > > + assertMapping(node, 0, 11, 4, 0, 4, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 11, 4, 13, 4, 16); // foo > > assertMapping(node, 0, 14, 4, 16, 4, 19); // = > > assertMapping(node, 0, 17, 4, 19, 4, 22); // 420 > > } > > @@ -113,7 +121,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static var foo:int = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @type {number}\n */\nRoyaleTest_A.foo = > 420 > > - assertMapping(node, 0, 11, 4, 0, 4, 16); // foo > > + assertMapping(node, 0, 11, 4, 0, 4, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 11, 4, 13, 4, 16); // foo > > assertMapping(node, 0, 18, 4, 16, 4, 19); // = > > assertMapping(node, 0, 21, 4, 19, 4, 22); // 420 > > } > > @@ -124,7 +133,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("const foo;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {*}\n > */\nRoyaleTest_A.prototype.foo > > - assertMapping(node, 0, 6, 5, 0, 5, 26); // foo > > + assertMapping(node, 0, 6, 5, 0, 5, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 6, 5, 23, 5, 26); // foo > > } > > > > @Test > > @@ -133,7 +143,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("const foo:int;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {number}\n > */\nRoyaleTest_A.prototype.foo = 0 > > - assertMapping(node, 0, 6, 5, 0, 5, 26); // foo > > + assertMapping(node, 0, 6, 5, 0, 5, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 6, 5, 23, 5, 26); // foo > > } > > > > @Test > > @@ -142,7 +153,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("const foo = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {*}\n > */\nRoyaleTest_A.prototype.foo = 420 > > - assertMapping(node, 0, 6, 5, 0, 5, 26); // foo > > + assertMapping(node, 0, 6, 5, 0, 5, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 6, 5, 23, 5, 26); // foo > > assertMapping(node, 0, 9, 5, 26, 5, 29); // = > > assertMapping(node, 0, 12, 5, 29, 5, 32); // 420 > > } > > @@ -153,7 +165,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("const foo:int = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {number}\n > */\nRoyaleTest_A.prototype.foo = 420 > > - assertMapping(node, 0, 6, 5, 0, 5, 26); // foo > > + assertMapping(node, 0, 6, 5, 0, 5, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 6, 5, 23, 5, 26); // foo > > assertMapping(node, 0, 13, 5, 26, 5, 29); // = > > assertMapping(node, 0, 16, 5, 29, 5, 32); // 420 > > } > > @@ -164,7 +177,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static const foo;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {*}\n > */\nRoyaleTest_A.foo > > - assertMapping(node, 0, 13, 5, 0, 5, 16); // foo > > + assertMapping(node, 0, 13, 5, 0, 5, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 13, 5, 13, 5, 16); // foo > > } > > > > @Test > > @@ -173,7 +187,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static const foo:int;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {number}\n > */\nRoyaleTest_A.foo = 0 > > - assertMapping(node, 0, 13, 5, 0, 5, 16); // foo > > + assertMapping(node, 0, 13, 5, 0, 5, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 13, 5, 13, 5, 16); // foo > > } > > > > @Test > > @@ -182,7 +197,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static const foo = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {*}\n > */\nRoyaleTest_A.foo = 420 > > - assertMapping(node, 0, 13, 5, 0, 5, 16); // foo > > + assertMapping(node, 0, 13, 5, 0, 5, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 13, 5, 13, 5, 16); // foo > > assertMapping(node, 0, 16, 5, 16, 5, 19); // = > > assertMapping(node, 0, 19, 5, 19, 5, 22); // 420 > > } > > @@ -193,7 +209,8 @@ public class TestSourceMapFieldMembers extends > SourceMapTestBase > > IVariableNode node = getField("static const foo:int = 420;"); > > asBlockWalker.visitVariable(node); > > ///**\n * @package\n * @const\n * @type {number}\n > */\nRoyaleTest_A.foo = 420 > > - assertMapping(node, 0, 13, 5, 0, 5, 16); // foo > > + assertMapping(node, 0, 13, 5, 0, 5, 13); // RoyaleTest_A. > > + assertMapping(node, 0, 13, 5, 13, 5, 16); // foo > > assertMapping(node, 0, 20, 5, 16, 5, 19); // = > > assertMapping(node, 0, 23, 5, 19, 5, 22); // 420 > > } > > diff --git > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapMethodMembers.java > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapMethodMembers.java > > new file mode 100644 > > index 000000000..a0933567f > > --- /dev/null > > +++ > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/sourcemaps/TestSourceMapMethodMembers.java > > @@ -0,0 +1,48 @@ > > +/* > > + * > > + * 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.royale.compiler.internal.codegen.js.sourcemaps; > > + > > +import org.apache.royale.compiler.driver.IBackend; > > +import > org.apache.royale.compiler.internal.driver.js.royale.RoyaleBackend; > > +import org.apache.royale.compiler.internal.test.SourceMapTestBase; > > +import org.apache.royale.compiler.tree.as.IFunctionNode; > > +import org.junit.Test; > > + > > +public class TestSourceMapMethodMembers extends SourceMapTestBase > > +{ > > + @Test > > + public void testMethod() > > + { > > + IFunctionNode node = getMethod("function foo(){}"); > > + asBlockWalker.visitFunction(node); > > + //RoyaleTest_A.prototype.foo = function() {\n} > > + assertMapping(node, 0, 9, 0, 0, 0, 23); // > RoyaleTest_A.prototype. > > + assertMapping(node, 0, 9, 0, 23, 0, 26); // foo > > + assertMapping(node, 0, 0, 0, 26, 0, 37); // = function > > + assertMapping(node, 0, 12, 0, 37, 0, 38); // ( > > + assertMapping(node, 0, 13, 0, 38, 0, 39); // ) > > + assertMapping(node, 0, 14, 0, 40, 0, 41); // { > > + assertMapping(node, 0, 15, 1, 0, 1, 1); // } > > + } > > + > > + protected IBackend createBackend() > > + { > > + return new RoyaleBackend(); > > + } > > +} > > diff --git > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/SourceMapTestBase.java > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/SourceMapTestBase.java > > index df0f30abf..9ab45387e 100644 > > --- > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/SourceMapTestBase.java > > +++ > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/test/SourceMapTestBase.java > > @@ -41,6 +41,12 @@ public class SourceMapTestBase extends ASTestBase > > > > protected void assertMapping(IASNode node, int nodeStartLine, int > nodeStartColumn, > > int outStartLine, int outStartColumn, int outEndLine, int > outEndColumn) > > + { > > + assertMapping(node, nodeStartLine, nodeStartColumn, > outStartLine, outStartColumn, outEndLine, outEndColumn, null); > > + } > > + > > + protected void assertMapping(IASNode node, int nodeStartLine, int > nodeStartColumn, > > + int outStartLine, int outStartColumn, int outEndLine, int > outEndColumn, String symbolName) > > { > > int sourceStartLine = nodeStartLine + node.getLine(); > > int sourceStartColumn = nodeStartColumn; > > @@ -60,14 +66,39 @@ public class SourceMapTestBase extends ASTestBase > > && startPosition.getLine() == outStartLine > > && startPosition.getColumn() == outStartColumn > > && endPosition.getLine() == outEndLine > > - && endPosition.getColumn() == outEndColumn) > > + && endPosition.getColumn() == outEndColumn > > + && ((symbolName == null && mapping.name == null) > || (symbolName != null && symbolName.equals(mapping.name)))) > > { > > foundMapping = true; > > break; > > } > > } > > + // uncomment for debugging > > + // if (!foundMapping) > > + // { > > + // System.err.println("generated code:"); > > + // System.err.println(writer.toString()); > > + // System.err.println("expected mapping:"); > > + // System.err.println(" name: " + symbolName); > > + // System.err.println(" node: " + nodeStartLine + ", " + > nodeStartColumn); > > + // System.err.println(" source: " + sourceStartLine + ", " > + sourceStartColumn); > > + // System.err.println(" start: " + outStartLine + ", " + > outStartColumn); > > + // System.err.println(" end: " + outEndLine + ", " + > outEndColumn); > > + // for (int i = 0; i < mappings.size(); i++) > > + // { > > + // IMappingEmitter.SourceMapMapping mapping = > mappings.get(i); > > + // System.err.println("actual mapping (" + i + "):"); > > + // FilePosition sourcePosition = > mapping.sourceStartPosition; > > + // FilePosition startPosition = > mapping.destStartPosition; > > + // FilePosition endPosition = mapping.destEndPosition; > > + // System.err.println(" name: " + mapping.name); > > + // System.err.println(" source: " + > sourcePosition.getLine() + ", " + sourcePosition.getColumn()); > > + // System.err.println(" start: " + > startPosition.getLine() + ", " + startPosition.getColumn()); > > + // System.err.println(" end: " + > endPosition.getLine() + ", " + endPosition.getColumn()); > > + // } > > + // } > > assertTrue("Mapping not found for node " + node.getNodeID() + ". > Expected " > > - + "source: (" + nodeStartLine + ", " + nodeStartColumn > + "), dest: (" + outStartLine + ", " + outStartColumn + ") to (" + > outEndLine + ", " + outEndColumn + ")", > > + + "source: (" + nodeStartLine + ", " + nodeStartColumn > + "), dest: (" + outStartLine + ", " + outStartColumn + ") to (" + > outEndLine + ", " + outEndColumn + "), name: " + symbolName, > > foundMapping); > > } > > > > > >