Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ts.createJsxOpeningElement throws Debug Failure. False expression. #24380

Open
Nufflee opened this issue May 24, 2018 · 0 comments
Open

ts.createJsxOpeningElement throws Debug Failure. False expression. #24380

Nufflee opened this issue May 24, 2018 · 0 comments
Labels
API Relates to the public API for TypeScript Bug A bug in TypeScript
Milestone

Comments

@Nufflee
Copy link

Nufflee commented May 24, 2018

TypeScript Version: 2.8.3 (I used this version because I was getting a completely different error when I updated to the latest @next version. Probably caused by ttypescript or some other dependency that's not updated to the latest version)

Search Terms: compiler API, transform

Code

import * as ts from 'typescript'

export default function transformer() {
  return (context: ts.TransformationContext) => {
    return (sourceFile: ts.SourceFile) => {
      return visitNodeAndChildren(sourceFile)

      function visitNodeAndChildren(node: ts.Node): ts.VisitResult<ts.Node> {
        return ts.visitEachChild(visitNode(node), (childNode) => visitNodeAndChildren(childNode), context)
      }

      function visitNode(node: ts.Node): ts.Node {
        switch (node.kind) {
          case ts.SyntaxKind.JsxElement:
            const element = node as ts.JsxElement

            return ts.createJsxElement(ts.createJsxOpeningElement(element.openingElement.tagName, element.openingElement.attributes), element.children, element.closingElement)
          default:
            return node
        }
      }
    }
  }
}

I'm running this using ttsc but I don't think that's the issue.

Expected behavior:
No error.

Actual behavior:

    at resolveNameHelper (node_modules\typescript\lib\typescript.js:26726:30)
    at resolveName (node_modules\typescript\lib\typescript.js:26489:20)
    at getReferencedValueSymbol (node_modules\typescript\lib\typescript.js:48917:20)
    at Object.getReferencedDeclarationWithCollidingName (node_modules\typescript\lib\typescript.js:48672:34)
    at substituteExpressionIdentifier (node_modules\typescript\lib\typescript.js:63756:44)
    at substituteExpression (node_modules\typescript\lib\typescript.js:63743:28)
    at onSubstituteNode (node_modules\typescript\lib\typescript.js:63696:24)
    at onSubstituteNode (node_modules\typescript\lib\typescript.js:65555:20)
    at onSubstituteNode (node_modules\typescript\lib\typescript.js:69452:20)
    at substituteNode (node_modules\typescript\lib\typescript.js:69643:59)
    at trySubstituteNode (node_modules\typescript\lib\typescript.js:73151:46)
    at pipelineEmitWithComments (node_modules\typescript\lib\typescript.js:72765:20)
    at emitNodeWithNotification (node_modules\typescript\lib\typescript.js:69674:21)
    at pipelineEmitWithNotification (node_modules\typescript\lib\typescript.js:72758:17)
    at emitExpression (node_modules\typescript\lib\typescript.js:72754:13)
    at emitPropertyAccessExpression (node_modules\typescript\lib\typescript.js:73547:13)
    at pipelineEmitExpression (node_modules\typescript\lib\typescript.js:73087:28)
    at pipelineEmitWithHint (node_modules\typescript\lib\typescript.js:72785:49)
    at emitNodeWithSourceMap (node_modules\typescript\lib\typescript.js:70051:21)
    at pipelineEmitWithSourceMap (node_modules\typescript\lib\typescript.js:72775:17)
    at emitNodeWithNestedComments (node_modules\typescript\lib\typescript.js:70340:17)
    at emitNodeWithSynthesizedComments (node_modules\typescript\lib\typescript.js:70290:13)
    at emitNodeWithComments (node_modules\typescript\lib\typescript.js:70226:21)
    at pipelineEmitWithComments (node_modules\typescript\lib\typescript.js:72767:17)
    at emitNodeWithNotification (node_modules\typescript\lib\typescript.js:69674:21)
    at pipelineEmitWithNotification (node_modules\typescript\lib\typescript.js:72758:17)
    at emitExpression (node_modules\typescript\lib\typescript.js:72754:13)
    at emitCallExpression (node_modules\typescript\lib\typescript.js:73584:13)
    at pipelineEmitExpression (node_modules\typescript\lib\typescript.js:73091:28)
    at pipelineEmitWithHint (node_modules\typescript\lib\typescript.js:72785:49)
(node:23136) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a
 promise which was not handled with .catch(). (rejection id: 1)

Workaround: This seems to actually error sometimes and I can't figure out how to reproduce the fail so I don't recommend to use this workaround. To work around this, I had to remove the ts.createJsxOpeningElement call and alter the properties myself. Example:

import * as ts from 'typescript'

export default function transformer() {
  return (context: ts.TransformationContext) => {
    return (sourceFile: ts.SourceFile) => {
      return visitNodeAndChildren(sourceFile)

      function visitNodeAndChildren(node: ts.Node): ts.VisitResult<ts.Node> {
        return ts.visitEachChild(visitNode(node), (childNode) => visitNodeAndChildren(childNode), context)
      }

      function visitNode(node: ts.Node): ts.Node {
        switch (node.kind) {
          case ts.SyntaxKind.JsxElement:
            const element = node as ts.JsxElement

+           element.openingElement.tagName = ts.createLiteral('whatever') // I wanted to alter the tag name in my case but should be the same for altering the attributes

-           return ts.createJsxElement(ts.createJsxOpeningElement(element.openingElement.tagName, element.openingElement.attributes), element.children, element.closingElement)
+           return ts.createJsxElement(element.openingElement, element.children, element.closingElement)
          default:
            return node
        }
      }
    }
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
API Relates to the public API for TypeScript Bug A bug in TypeScript
Projects
None yet
Development

No branches or pull requests

4 participants