Fixes renaming not affecting JSX closing tags (#4093)

This commit is contained in:
Ryan Cavanaugh
2015-07-30 23:17:29 -07:00
parent 7e9e920d1e
commit 88a8d2bea8
15 changed files with 122 additions and 18 deletions

View File

@@ -7180,13 +7180,17 @@ namespace ts {
}
function checkJsxElement(node: JsxElement) {
// Check attributes
checkJsxOpeningLikeElement(node.openingElement);
// Check that the closing tag matches
if (!tagNamesAreEquivalent(node.openingElement.tagName, node.closingElement.tagName)) {
error(node.closingElement, Diagnostics.Expected_corresponding_JSX_closing_tag_for_0, getTextOfNode(node.openingElement.tagName));
}
// Check attributes
checkJsxOpeningLikeElement(node.openingElement);
else {
// Perform resolution on the closing tag so that rename/go to definition/etc work
getJsxElementTagSymbol(node.closingElement);
}
// Check children
for (let child of node.children) {
@@ -7297,7 +7301,7 @@ namespace ts {
/// If this is a class-based tag (otherwise returns undefined), returns the symbol of the class
/// type or factory function.
/// Otherwise, returns unknownSymbol.
function getJsxElementTagSymbol(node: JsxOpeningLikeElement): Symbol {
function getJsxElementTagSymbol(node: JsxOpeningLikeElement|JsxClosingElement): Symbol {
let flags: JsxFlags = JsxFlags.UnknownElement;
let links = getNodeLinks(node);
if (!links.resolvedSymbol) {
@@ -7309,7 +7313,7 @@ namespace ts {
}
return links.resolvedSymbol;
function lookupIntrinsicTag(node: JsxOpeningLikeElement): Symbol {
function lookupIntrinsicTag(node: JsxOpeningLikeElement|JsxClosingElement): Symbol {
let intrinsicElementsType = getJsxIntrinsicElementsType();
if (intrinsicElementsType !== unknownType) {
// Property case
@@ -7337,19 +7341,10 @@ namespace ts {
}
}
function lookupClassTag(node: JsxOpeningLikeElement): Symbol {
let valueSymbol: Symbol;
function lookupClassTag(node: JsxOpeningLikeElement|JsxClosingElement): Symbol {
let valueSymbol: Symbol = resolveJsxTagName(node);
// Look up the value in the current scope
if (node.tagName.kind === SyntaxKind.Identifier) {
let tag = <Identifier>node.tagName;
let sym = getResolvedSymbol(tag);
valueSymbol = sym.exportSymbol || sym;
}
else {
valueSymbol = checkQualifiedName(<QualifiedName>node.tagName).symbol;
}
if (valueSymbol && valueSymbol !== unknownSymbol) {
links.jsxFlags |= JsxFlags.ClassElement;
getSymbolLinks(valueSymbol).referenced = true;
@@ -7357,6 +7352,17 @@ namespace ts {
return valueSymbol || unknownSymbol;
}
function resolveJsxTagName(node: JsxOpeningLikeElement|JsxClosingElement): Symbol {
if (node.tagName.kind === SyntaxKind.Identifier) {
let tag = <Identifier>node.tagName;
let sym = getResolvedSymbol(tag);
return sym.exportSymbol || sym;
}
else {
return checkQualifiedName(<QualifiedName>node.tagName).symbol;
}
}
}
/**
@@ -13879,7 +13885,9 @@ namespace ts {
meaning |= SymbolFlags.Alias;
return resolveEntityName(<EntityName>entityName, meaning);
}
else if ((entityName.parent.kind === SyntaxKind.JsxOpeningElement) || (entityName.parent.kind === SyntaxKind.JsxSelfClosingElement)) {
else if ((entityName.parent.kind === SyntaxKind.JsxOpeningElement) ||
(entityName.parent.kind === SyntaxKind.JsxSelfClosingElement) ||
(entityName.parent.kind === SyntaxKind.JsxClosingElement)) {
return getJsxElementTagSymbol(<JsxOpeningLikeElement>entityName.parent);
}
else if (isExpression(entityName)) {