XSLTC doesn't correctly set the parent of some nodes ... comile time failures result ------------------------------------------------------------------------------------
Key: XALANJ-2389 URL: https://issues.apache.org/jira/browse/XALANJ-2389 Project: XalanJ2 Issue Type: Bug Components: XSLTC Reporter: Brian Minchau There is a problem with AST node construction in XSLTC. When the processor is creating AST nodes for path expressions, it sometimes discards nodes that it creates, takes the child nodes, and attaches them to new parents. This can happen when nodes representing casts are injected. Inside the constructors and various setter methods for SyntaxTreeNode and its subclasses, there are calls to setParent that try to ensure that the child of a node points to its parent. The problem is that SyntaxTreeNode.setParent checks whether the parent of a node is not null, and if it is, it ignores the request to set the parent. In the case of the path expressions, some nodes that the parser has already created as children of other nodes get reattached to new parents in the middle of parsing. The behaviour of the setParent method means that such nodes point to the old parent which is disconnected from the rest of the parse tree. Much later, when generating code for VariableReference nodes, we loop through the parent chain looking for the nearest ancestor that implements the Closure interface. Predicate is one such class. But this problem in SyntaxTreeNode.setParent has the result that the variable reference node in the test case does not find a Predicate that ought to be in its ancestor chain. The problem is to ensure the SyntaxTreeNode._parent pointer is correct. It's not a simple matter of changing SyntaxTreeNode.setParent to unconditionally set the _parent field however. If you do that, other things end up being broken. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]