Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Adds the visitor API foundation for tree transformations. - #6892

Merged
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor
Mar 18, 2016
Merged

Adds the visitor API foundation for tree transformations.#6892
Ron Buckton (rbuckton) merged 131 commits into
transformsfrom
transforms-visitor

Conversation

@rbuckton

Copy link
Copy Markdown
Contributor

This provides the basic foundation for tree transformations. The additions include:

  • factory.ts - Which will include a growing list of node factory functions used by various transformations.
  • visitor.ts - The various visitor functions used for visiting the tree.

The visitNode function is used to visit single-node branches of a tree. It also provides a facility for converting an array of nodes (in the form of a NodeArrayNode) into a single node, for cases such as converting a single-statement branch of an IterationStatement into a Block.

The visitNodes function is used to visit an array of nodes. If there are no changes to any node in the array (all visited nodes have the same reference and the same number of nodes were written), then the original array is returned. This allows for faster change detection in visitEachChild by way of reference equality checks.

The visitEachNode function is used as a fallback mechanism to recursively apply a visitor to each branch of the tree. This function leverages nodeEdgeTraversalMap, which is used to describe which properties should be traversed as well as how to verify the tree.

The LexicalEnvironment interface will be leveraged in a later revision to provide a mechanism for hoisting temporary variables and function declarations.

Examples

The following is an example of a visitor that could be used with these helpers:

functionvisitor(node: Node){switch(node.kind){caseSyntaxKind.BinaryExpression:
returnvisitBinaryExpression(<BinaryExpression>node);
...
default:
returnvisitEachChild(node,visitor);}}functionvisitBinaryExpression(node: BinaryExpression){if(node.operatorToken.kind===SyntaxKind.AsteriskAsteriskToken){returncreateCall(createPropertyAccess(createIdentifier("Math"),"pow"),[visitNode(node.left,visitor,isExpressionNode),visitNode(node.right,visitor,isExpressionNode)]);}else{returnvisitEachChild(node,visitor);}}

Related Pull Requests:

Review on Reviewable

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Mohamed Hegazy (@mhegazy), Anders Hejlsberg (@ahejlsberg) I will be publishing a series of pull requests targeting the transforms branch, which is a recent branch of master. This way I am able to break up this work into smaller, more easily reviewed chunks. I also will regularly merge from master into transforms to keep it in sync. Once the transformation work is fully integrated into transforms, there will be a single PR to merge transforms into master.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

Another PR with the second layer of the transformations API will be published tomorrow.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

CC: Yui (@yuit), Daniel Rosenwasser (@DanielRosenwasser), Ryan Cavanaugh (@RyanCavanaugh), Vladimir Matveev (@vladima)

I want to make sure I have a lot of eyes on this implementation as we move forward.

Comment threadsrc/compiler/factory.ts Outdated
}

export function createNodeArrayNode<T extends Node>(elements?: (T | NodeArrayNode<T>)[]): NodeArrayNode<T> {
const array = <NodeArrayNode<T>>createNodeArray(elements);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you feed NodeArrayNode<T> as a type argument instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would end up being createNodeArray<T | NodeArrayNode<T>, NodeArrayNode<T>>(elements)), which isn't as clear.

@rbuckton

Copy link
Copy Markdown
ContributorAuthor

/* @internal */
namespace ts {
let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;
let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason you need to do this again instead of leveraging ts.createNode?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is partly performance related, as the ts namespace is horribly deoptimized in v8, but also due to the fact I have a slightly different call signature.

Ron Buckton (rbuckton)and others added 26 commits March 2, 2016 15:20
Adds a simplified pretty printer for tree transformations
Adds the transformFiles API for tree transformations
Adds the Transform Flags concept for tree transformations
Ron Buckton (rbuckton) added a commit that referenced this pull request Mar 18, 2016
Adds the visitor API foundation for tree transformations.
@rbuckton
Ron Buckton (rbuckton) merged commit 5732a60 into transformsMar 18, 2016
@rbuckton
Ron Buckton (rbuckton) deleted the transforms-visitor branch March 18, 2016 23:40
@microsoftMicrosoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@rbuckton@sandersn@yuit@DanielRosenwasser@msftclas