Skip to content

Commit

Permalink
Cherry-pick PR microsoft#44724 into release-4.3
Browse files Browse the repository at this point in the history
Component commits:
5545946 Fix auto imports in opening JSX tag
  • Loading branch information
andrewbranch authored and typescript-bot committed Jun 30, 2021
1 parent 3221035 commit e563bd3
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 9 deletions.
17 changes: 8 additions & 9 deletions src/services/completions.ts
Expand Up @@ -1275,10 +1275,9 @@ namespace ts.Completions {
getTypeScriptMemberSymbols();
}
else if (isRightOfOpenTag) {
const tagSymbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
Debug.assertEachIsDefined(tagSymbols, "getJsxIntrinsicTagNames() should all be defined");
symbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
Debug.assertEachIsDefined(symbols, "getJsxIntrinsicTagNames() should all be defined");
tryGetGlobalSymbols();
symbols = tagSymbols.concat(symbols);
completionKind = CompletionKind.Global;
keywordFilters = KeywordCompletionFilters.None;
}
Expand Down Expand Up @@ -1564,7 +1563,7 @@ namespace ts.Completions {
const attrsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes);
if (!attrsType) return GlobalsSearch.Continue;
const completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, ContextFlags.Completions);
symbols = filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer!.attributes, typeChecker), jsxContainer!.attributes.properties);
symbols = concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer!.attributes, typeChecker), jsxContainer!.attributes.properties));
setSortTextToOptionalMember();
completionKind = CompletionKind.MemberLike;
isNewIdentifierLocation = false;
Expand Down Expand Up @@ -1621,7 +1620,7 @@ namespace ts.Completions {

const symbolMeanings = (isTypeOnly ? SymbolFlags.None : SymbolFlags.Value) | SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Alias;

symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings);
symbols = concatenate(symbols, typeChecker.getSymbolsInScope(scopeNode, symbolMeanings));
Debug.assertEachIsDefined(symbols, "getSymbolsInScope() should all be defined");
for (const symbol of symbols) {
if (!typeChecker.isArgumentsSymbol(symbol) &&
Expand Down Expand Up @@ -1957,7 +1956,7 @@ namespace ts.Completions {
const existingMemberEscapedNames: Set<__String> = new Set();
existingMembers.forEach(s => existingMemberEscapedNames.add(s.escapedName));

symbols = filter(members, s => !existingMemberEscapedNames.has(s.escapedName));
symbols = concatenate(symbols, filter(members, s => !existingMemberEscapedNames.has(s.escapedName)));

completionKind = CompletionKind.ObjectPropertyDeclaration;
isNewIdentifierLocation = true;
Expand Down Expand Up @@ -2046,7 +2045,7 @@ namespace ts.Completions {

if (typeMembers && typeMembers.length > 0) {
// Add filtered items to the completion list
symbols = filterObjectMembersList(typeMembers, Debug.checkDefined(existingMembers));
symbols = concatenate(symbols, filterObjectMembersList(typeMembers, Debug.checkDefined(existingMembers)));
}
setSortTextToOptionalMember();

Expand Down Expand Up @@ -2082,7 +2081,7 @@ namespace ts.Completions {
isNewIdentifierLocation = false;
const exports = typeChecker.getExportsAndPropertiesOfModule(moduleSpecifierSymbol);
const existing = new Set((namedImportsOrExports.elements as NodeArray<ImportOrExportSpecifier>).filter(n => !isCurrentlyEditingNode(n)).map(n => (n.propertyName || n.name).escapedText));
symbols = exports.filter(e => e.escapedName !== InternalSymbolName.Default && !existing.has(e.escapedName));
symbols = concatenate(symbols, exports.filter(e => e.escapedName !== InternalSymbolName.Default && !existing.has(e.escapedName)));
return GlobalsSearch.Success;
}

Expand Down Expand Up @@ -2161,7 +2160,7 @@ namespace ts.Completions {
type?.symbol && typeChecker.getPropertiesOfType(typeChecker.getTypeOfSymbolAtLocation(type.symbol, decl)) :
type && typeChecker.getPropertiesOfType(type);
});
symbols = filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags);
symbols = concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
}

return GlobalsSearch.Success;
Expand Down
35 changes: 35 additions & 0 deletions tests/cases/fourslash/completionsImportFromJSXTag.ts
@@ -0,0 +1,35 @@
/// <reference path="fourslash.ts" />

// @jsx: react

// @Filename: /types.d.ts
//// declare namespace JSX {
//// interface IntrinsicElements { a }
//// }

// @Filename: /Box.tsx
//// export function Box(props: any) { return null; }

// @Filename: /App.tsx
//// export function App() {
//// return (
//// <div className="App">
//// <Box/**/
//// </div>
//// )
//// }

verify.applyCodeActionFromCompletion("", {
name: "Box",
source: "/Box",
description: `Import 'Box' from module "./Box"`,
newFileContent: `import { Box } from "./Box";
export function App() {
return (
<div className="App">
<Box
</div>
)
}`
});

0 comments on commit e563bd3

Please sign in to comment.