From 06badd0e0d334d5496a79a4b39f25d4cafffe053 Mon Sep 17 00:00:00 2001 From: Yui T Date: Tue, 8 Dec 2015 18:53:37 -0800 Subject: [PATCH 1/9] Update tests --- tests/cases/fourslash/tsxCompletion11.ts | 7 ++++++ tests/cases/fourslash/tsxCompletion12.ts | 8 +++++++ tests/cases/fourslash/tsxCompletion13.ts | 8 +++++++ tests/cases/fourslash/tsxCompletion14.ts | 8 +++++++ tests/cases/fourslash/tsxCompletion15.ts | 9 +++++++ tests/cases/fourslash/tsxCompletion16.ts | 7 ++++++ tests/cases/fourslash/tsxCompletion17.ts | 8 +++++++ tests/cases/fourslash/tsxCompletion18.ts | 30 ++++++++++++++++++++++++ tests/cases/fourslash/tsxQuickInfo1.ts | 18 ++++++++++++++ tests/cases/fourslash/tsxQuickInfo2.ts | 24 +++++++++++++++++++ 10 files changed, 127 insertions(+) create mode 100644 tests/cases/fourslash/tsxCompletion11.ts create mode 100644 tests/cases/fourslash/tsxCompletion12.ts create mode 100644 tests/cases/fourslash/tsxCompletion13.ts create mode 100644 tests/cases/fourslash/tsxCompletion14.ts create mode 100644 tests/cases/fourslash/tsxCompletion15.ts create mode 100644 tests/cases/fourslash/tsxCompletion16.ts create mode 100644 tests/cases/fourslash/tsxCompletion17.ts create mode 100644 tests/cases/fourslash/tsxCompletion18.ts create mode 100644 tests/cases/fourslash/tsxQuickInfo1.ts create mode 100644 tests/cases/fourslash/tsxQuickInfo2.ts diff --git a/tests/cases/fourslash/tsxCompletion11.ts b/tests/cases/fourslash/tsxCompletion11.ts new file mode 100644 index 00000000000..70626a84791 --- /dev/null +++ b/tests/cases/fourslash/tsxCompletion11.ts @@ -0,0 +1,7 @@ +/// + +//@Filename: file.tsx +//// var x1 = + +//@Filename: file.tsx +//// var x1 =
+ +//@Filename: file.tsx +//// class MyElement {} +//// var x1 = + +//@Filename: file.tsx +//// class MyElement {} +//// var x1 = + +//@Filename: file.tsx +//// class MyElement {} +//// var x1 = + +//@Filename: file.tsx +//// var x1 = + +//@Filename: file.tsx +//// var x1 = + +//@Filename: file.tsx +//// var x =
+////

+//// +//// +//// + +goTo.marker("1"); +verify.memberListCount(1); +verify.completionListContains('h1'); + +goTo.marker("2"); +verify.memberListCount(1); +verify.completionListContains('div'); + +goTo.marker("3"); +verify.memberListCount(0); + +goTo.marker("4"); +verify.memberListCount(1); +verify.completionListContains('div'); + +goTo.marker("5"); +verify.memberListCount(0); + +goTo.marker("6"); +verify.memberListCount(1); +verify.completionListContains('div'); \ No newline at end of file diff --git a/tests/cases/fourslash/tsxQuickInfo1.ts b/tests/cases/fourslash/tsxQuickInfo1.ts new file mode 100644 index 00000000000..b1db1eb4a47 --- /dev/null +++ b/tests/cases/fourslash/tsxQuickInfo1.ts @@ -0,0 +1,18 @@ +/// + +//@Filename: file.tsx +//// var x1 = +//// class MyElement {} +//// var z = + +goTo.marker("1"); +verify.quickInfoIs("any", undefined); + +goTo.marker("2"); +verify.quickInfoIs("any", undefined);; + +goTo.marker("3"); +verify.quickInfoIs("class MyElement", undefined);; + +goTo.marker("4"); +verify.quickInfoIs("class MyElement", undefined);; \ No newline at end of file diff --git a/tests/cases/fourslash/tsxQuickInfo2.ts b/tests/cases/fourslash/tsxQuickInfo2.ts new file mode 100644 index 00000000000..0eb7a5100c4 --- /dev/null +++ b/tests/cases/fourslash/tsxQuickInfo2.ts @@ -0,0 +1,24 @@ +/// + +//@Filename: file.tsx +//// declare module JSX { +//// interface Element { } +//// interface IntrinsicElements { +//// div: any +//// } +//// } +//// var x1 = +//// class MyElement {} +//// var z = + +goTo.marker("1"); +verify.quickInfoIs("(property) JSX.IntrinsicElements.div: any", undefined); + +goTo.marker("2"); +verify.quickInfoIs("(property) JSX.IntrinsicElements.div: any", undefined);; + +goTo.marker("3"); +verify.quickInfoIs("class MyElement", undefined);; + +goTo.marker("4"); +verify.quickInfoIs("class MyElement", undefined);; \ No newline at end of file From 48894e5023d94770a8d2422d8f0d9d937372f5bd Mon Sep 17 00:00:00 2001 From: Yui T Date: Tue, 8 Dec 2015 18:54:29 -0800 Subject: [PATCH 2/9] Don't include completion in opening tag, include name of opening in closing tag --- src/compiler/checker.ts | 8 ++++++-- src/compiler/types.ts | 3 ++- src/services/services.ts | 40 ++++++++++++++++++++++++++++++++-------- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 30d4818592b..f02520b24fd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -61,6 +61,7 @@ namespace ts { getTypeCount: () => typeCount, isUndefinedSymbol: symbol => symbol === undefinedSymbol, isArgumentsSymbol: symbol => symbol === argumentsSymbol, + isUnknownSymbol: symbol => symbol === unknownSymbol, getDiagnostics, getGlobalDiagnostics, @@ -7979,6 +7980,7 @@ namespace ts { if (compilerOptions.noImplicitAny) { error(node, Diagnostics.JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists, JsxNames.IntrinsicElements); } + return unknownSymbol; } } @@ -14574,7 +14576,7 @@ namespace ts { return false; } - function getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[] { + function getSymbolsInScope(location: Node, meaning: SymbolFlags, includeAllGlobalSymbols: boolean): Symbol[] { const symbols: SymbolTable = {}; let memberFlags: NodeFlags = 0; @@ -14637,7 +14639,9 @@ namespace ts { location = location.parent; } - copySymbols(globals, meaning); + if (includeAllGlobalSymbols) { + copySymbols(globals, meaning); + } } /** diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 9411437c981..eb93ceee093 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1717,7 +1717,7 @@ namespace ts { getBaseTypes(type: InterfaceType): ObjectType[]; getReturnTypeOfSignature(signature: Signature): Type; - getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[]; + getSymbolsInScope(location: Node, meaning: SymbolFlags, includeAllGlobalSymbols: boolean): Symbol[]; getSymbolAtLocation(node: Node): Symbol; getShorthandAssignmentValueSymbol(location: Node): Symbol; getTypeAtLocation(node: Node): Type; @@ -1733,6 +1733,7 @@ namespace ts { isImplementationOfOverload(node: FunctionLikeDeclaration): boolean; isUndefinedSymbol(symbol: Symbol): boolean; isArgumentsSymbol(symbol: Symbol): boolean; + isUnknownSymbol(symbol: Symbol): boolean; getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): number; isValidPropertyAccess(node: PropertyAccessExpression | QualifiedName, propertyName: string): boolean; diff --git a/src/services/services.ts b/src/services/services.ts index a9dda549ead..7e12a521a4d 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3099,6 +3099,7 @@ namespace ts { } else if (kind === SyntaxKind.SlashToken && contextToken.parent.kind === SyntaxKind.JsxClosingElement) { isStartingCloseTag = true; + location = contextToken; } } } @@ -3113,7 +3114,9 @@ namespace ts { } else if (isRightOfOpenTag) { let tagSymbols = typeChecker.getJsxIntrinsicTagNames(); - if (tryGetGlobalSymbols()) { + // If the currect cursor is inside JSX opening tag, the only meaningful completions are those of JSX.IntrinsicElements or users defined React.Component + // If the services can't find those symbols, then show nothing instead of including all the global symbols in the completion list. + if (tryGetGlobalSymbols(/*includeAllGlobalSymbols*/false)) { symbols = tagSymbols.concat(symbols.filter(s => !!(s.flags & SymbolFlags.Value))); } else { @@ -3123,8 +3126,12 @@ namespace ts { isNewIdentifierLocation = false; } else if (isStartingCloseTag) { - let tagName = (contextToken.parent.parent).openingElement.tagName; - symbols = [typeChecker.getSymbolAtLocation(tagName)]; + const tagName = (contextToken.parent.parent).openingElement.tagName; + const tagSymbol = typeChecker.getSymbolAtLocation(tagName); + + if (!typeChecker.isUnknownSymbol(tagSymbol)) { + symbols = [tagSymbol]; + } isMemberCompletion = true; isNewIdentifierLocation = false; @@ -3133,7 +3140,7 @@ namespace ts { // For JavaScript or TypeScript, if we're not after a dot, then just try to get the // global symbols in scope. These results should be valid for either language as // the set of symbols that can be referenced from this location. - if (!tryGetGlobalSymbols()) { + if (!tryGetGlobalSymbols(/*includeAllGlobalSymbols*/true)) { return undefined; } } @@ -3193,7 +3200,7 @@ namespace ts { } } - function tryGetGlobalSymbols(): boolean { + function tryGetGlobalSymbols(includeAllGlobalSymbols: boolean): boolean { let objectLikeContainer: ObjectLiteralExpression | BindingPattern; let namedImportsOrExports: NamedImportsOrExports; let jsxContainer: JsxOpeningLikeElement; @@ -3264,7 +3271,7 @@ namespace ts { /// TODO filter meaning based on the current context let symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; - symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings); + symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings, includeAllGlobalSymbols); return true; } @@ -3831,7 +3838,23 @@ namespace ts { } else { if (!symbols || symbols.length === 0) { - return undefined; + if (sourceFile.languageVariant === LanguageVariant.JSX && + location.parent && location.parent.kind === SyntaxKind.JsxClosingElement) { + // In the TypeScript JSX element, if such element is not defined. When users query for completion at closing tag, + // instead of simply giving unknown value, the completion will return the tag-name of an associated opening-element. + // For example: + // var x =
completion list at "1" will contain "div" with type any + const tagName = (location.parent.parent).openingElement.tagName; + entries.push({ + name: (tagName).text, + kind: undefined, + kindModifiers: undefined, + sortText: "0", + }); + } + else { + return undefined; + } } getCompletionEntriesFromSymbols(symbols, entries); @@ -3907,6 +3930,7 @@ namespace ts { function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: CompletionEntry[]): Map { let start = new Date().getTime(); let uniqueNames: Map = {}; + if (symbols) { for (let symbol of symbols) { let entry = createCompletionEntry(symbol, location); @@ -4439,7 +4463,7 @@ namespace ts { let typeChecker = program.getTypeChecker(); let symbol = typeChecker.getSymbolAtLocation(node); - if (!symbol) { + if (!symbol || typeChecker.isUnknownSymbol(symbol)) { // Try getting just type at this position and show switch (node.kind) { case SyntaxKind.Identifier: From 0c699ad474983302bdfd38b3c1925df92ca07dc1 Mon Sep 17 00:00:00 2001 From: Yui T Date: Tue, 8 Dec 2015 18:54:52 -0800 Subject: [PATCH 3/9] Update baseline from returning with unknownSymbol --- .../jsxEmitAttributeWithPreserve.symbols | 1 + tests/baselines/reference/jsxHash.symbols | 34 +++++++++++++++ .../reference/jsxImportInAttribute.symbols | 1 + .../reference/jsxReactTestSuite.symbols | 42 +++++++++++++++++++ .../reference/keywordInJsxIdentifier.symbols | 4 ++ .../reference/tsxElementResolution13.symbols | 1 + .../reference/tsxElementResolution14.symbols | 1 + .../reference/tsxElementResolution5.symbols | 1 + .../reference/tsxExternalModuleEmit1.symbols | 2 + tests/baselines/reference/tsxNoJsx.symbols | 6 +-- .../baselines/reference/tsxTypeErrors.symbols | 4 ++ 11 files changed, 94 insertions(+), 3 deletions(-) diff --git a/tests/baselines/reference/jsxEmitAttributeWithPreserve.symbols b/tests/baselines/reference/jsxEmitAttributeWithPreserve.symbols index 4ffadb8e888..82eceb8e637 100644 --- a/tests/baselines/reference/jsxEmitAttributeWithPreserve.symbols +++ b/tests/baselines/reference/jsxEmitAttributeWithPreserve.symbols @@ -4,5 +4,6 @@ declare var React: any; >React : Symbol(React, Decl(jsxEmitAttributeWithPreserve.tsx, 1, 11)) +>foo : Symbol(unknown) >data : Symbol(unknown) diff --git a/tests/baselines/reference/jsxHash.symbols b/tests/baselines/reference/jsxHash.symbols index 8a6ad0849f0..ddba4832d2c 100644 --- a/tests/baselines/reference/jsxHash.symbols +++ b/tests/baselines/reference/jsxHash.symbols @@ -1,34 +1,68 @@ === tests/cases/compiler/jsxHash.tsx === var t02 = {0}#; >t02 : Symbol(t02, Decl(jsxHash.tsx, 0, 3)) +>a : Symbol(unknown) +>a : Symbol(unknown) var t03 = #{0}; >t03 : Symbol(t03, Decl(jsxHash.tsx, 1, 3)) +>a : Symbol(unknown) +>a : Symbol(unknown) var t04 = #{0}#; >t04 : Symbol(t04, Decl(jsxHash.tsx, 2, 3)) +>a : Symbol(unknown) +>a : Symbol(unknown) var t05 = #; >t05 : Symbol(t05, Decl(jsxHash.tsx, 3, 3)) +>a : Symbol(unknown) +>i : Symbol(unknown) +>i : Symbol(unknown) +>a : Symbol(unknown) var t06 = #; >t06 : Symbol(t06, Decl(jsxHash.tsx, 4, 3)) +>a : Symbol(unknown) +>i : Symbol(unknown) +>i : Symbol(unknown) +>a : Symbol(unknown) var t07 = ##; >t07 : Symbol(t07, Decl(jsxHash.tsx, 5, 3)) +>a : Symbol(unknown) +>i : Symbol(unknown) +>i : Symbol(unknown) +>a : Symbol(unknown) var t08 = #; >t08 : Symbol(t08, Decl(jsxHash.tsx, 6, 3)) +>a : Symbol(unknown) +>i : Symbol(unknown) +>i : Symbol(unknown) +>a : Symbol(unknown) var t09 = ##; >t09 : Symbol(t09, Decl(jsxHash.tsx, 7, 3)) +>a : Symbol(unknown) +>i : Symbol(unknown) +>i : Symbol(unknown) +>a : Symbol(unknown) var t10 = #; >t10 : Symbol(t10, Decl(jsxHash.tsx, 8, 3)) +>a : Symbol(unknown) +>i : Symbol(unknown) +>a : Symbol(unknown) var t11 = #; >t11 : Symbol(t11, Decl(jsxHash.tsx, 9, 3)) +>a : Symbol(unknown) +>i : Symbol(unknown) +>a : Symbol(unknown) var t12 = #; >t12 : Symbol(t12, Decl(jsxHash.tsx, 10, 3)) +>a : Symbol(unknown) +>a : Symbol(unknown) diff --git a/tests/baselines/reference/jsxImportInAttribute.symbols b/tests/baselines/reference/jsxImportInAttribute.symbols index 845001b22c0..252b5cc98e4 100644 --- a/tests/baselines/reference/jsxImportInAttribute.symbols +++ b/tests/baselines/reference/jsxImportInAttribute.symbols @@ -8,6 +8,7 @@ let x = Test; // emit test_1.default >Test : Symbol(Test, Decl(consumer.tsx, 1, 6)) ; // ? +>anything : Symbol(unknown) >attr : Symbol(unknown) >Test : Symbol(Test, Decl(consumer.tsx, 1, 6)) diff --git a/tests/baselines/reference/jsxReactTestSuite.symbols b/tests/baselines/reference/jsxReactTestSuite.symbols index b86054ac560..cca1dae915b 100644 --- a/tests/baselines/reference/jsxReactTestSuite.symbols +++ b/tests/baselines/reference/jsxReactTestSuite.symbols @@ -37,21 +37,36 @@ declare var hasOwnProperty:any; >hasOwnProperty : Symbol(hasOwnProperty, Decl(jsxReactTestSuite.tsx, 12, 11))
text
; +>div : Symbol(unknown) +>div : Symbol(unknown)
+>div : Symbol(unknown) + {this.props.children}
; +>div : Symbol(unknown)
+>div : Symbol(unknown) +

+>div : Symbol(unknown) +>br : Symbol(unknown) +>div : Symbol(unknown) + {foo}
{bar}
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) >foo : Symbol(foo, Decl(jsxReactTestSuite.tsx, 7, 11)) +>br : Symbol(unknown) >bar : Symbol(bar, Decl(jsxReactTestSuite.tsx, 8, 11)) >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
+>br : Symbol(unknown) +
; +>div : Symbol(unknown) @@ -74,6 +89,8 @@ var x = >x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
div : Symbol(unknown) + attr1={ >attr1 : Symbol(unknown) @@ -97,41 +114,64 @@ var x = >attr4 : Symbol(unknown)
; +>div : Symbol(unknown) (
+>div : Symbol(unknown) + {/* A comment at the beginning */} {/* A second comment at the beginning */} +>span : Symbol(unknown) + {/* A nested comment */} +>span : Symbol(unknown) + {/* A sandwiched comment */}
+>br : Symbol(unknown) + {/* A comment at the end */} {/* A second comment at the end */}
+>div : Symbol(unknown) + ); (
div : Symbol(unknown) + /* a multi-line comment */ attr1="foo"> >attr1 : Symbol(unknown) span : Symbol(unknown) + attr2="bar" >attr2 : Symbol(unknown) />
+>div : Symbol(unknown) + );
 
; +>div : Symbol(unknown) +>div : Symbol(unknown)
 
; +>div : Symbol(unknown) +>div : Symbol(unknown) testing; +>hasOwnProperty : Symbol(unknown) +>hasOwnProperty : Symbol(unknown) ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) @@ -158,6 +198,7 @@ var x = >sound : Symbol(unknown) ; +>font-face : Symbol(unknown) ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) @@ -165,6 +206,7 @@ var x = >y : Symbol(y, Decl(jsxReactTestSuite.tsx, 9, 11)) ; +>x-component : Symbol(unknown) ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) diff --git a/tests/baselines/reference/keywordInJsxIdentifier.symbols b/tests/baselines/reference/keywordInJsxIdentifier.symbols index 874d7801a7f..3cb977bee81 100644 --- a/tests/baselines/reference/keywordInJsxIdentifier.symbols +++ b/tests/baselines/reference/keywordInJsxIdentifier.symbols @@ -4,14 +4,18 @@ declare var React: any; >React : Symbol(React, Decl(keywordInJsxIdentifier.tsx, 1, 11)) ; +>foo : Symbol(unknown) >class-id : Symbol(unknown) ; +>foo : Symbol(unknown) >class : Symbol(unknown) ; +>foo : Symbol(unknown) >class-id : Symbol(unknown) ; +>foo : Symbol(unknown) >class : Symbol(unknown) diff --git a/tests/baselines/reference/tsxElementResolution13.symbols b/tests/baselines/reference/tsxElementResolution13.symbols index 94758b291ac..4b6a5b4f4e7 100644 --- a/tests/baselines/reference/tsxElementResolution13.symbols +++ b/tests/baselines/reference/tsxElementResolution13.symbols @@ -22,5 +22,6 @@ var obj1: Obj1; >Obj1 : Symbol(Obj1, Decl(file.tsx, 3, 1)) ; // Error +>obj1 : Symbol(unknown) >x : Symbol(unknown) diff --git a/tests/baselines/reference/tsxElementResolution14.symbols b/tests/baselines/reference/tsxElementResolution14.symbols index 2400ef620eb..a605606b1ed 100644 --- a/tests/baselines/reference/tsxElementResolution14.symbols +++ b/tests/baselines/reference/tsxElementResolution14.symbols @@ -17,5 +17,6 @@ var obj1: Obj1; >Obj1 : Symbol(Obj1, Decl(file.tsx, 2, 1)) ; // OK +>obj1 : Symbol(unknown) >x : Symbol(unknown) diff --git a/tests/baselines/reference/tsxElementResolution5.symbols b/tests/baselines/reference/tsxElementResolution5.symbols index 461ffd78aaa..e0fc1147083 100644 --- a/tests/baselines/reference/tsxElementResolution5.symbols +++ b/tests/baselines/reference/tsxElementResolution5.symbols @@ -8,5 +8,6 @@ declare module JSX { // OK, but implicit any
; +>div : Symbol(unknown) >n : Symbol(unknown) diff --git a/tests/baselines/reference/tsxExternalModuleEmit1.symbols b/tests/baselines/reference/tsxExternalModuleEmit1.symbols index 5e8eb2fed4e..129edcca0d1 100644 --- a/tests/baselines/reference/tsxExternalModuleEmit1.symbols +++ b/tests/baselines/reference/tsxExternalModuleEmit1.symbols @@ -44,6 +44,8 @@ export class Button extends React.Component { >render : Symbol(render, Decl(button.tsx, 2, 55)) return ; +>button : Symbol(unknown) +>button : Symbol(unknown) } } diff --git a/tests/baselines/reference/tsxNoJsx.symbols b/tests/baselines/reference/tsxNoJsx.symbols index 6744c2edb10..4492e83cf10 100644 --- a/tests/baselines/reference/tsxNoJsx.symbols +++ b/tests/baselines/reference/tsxNoJsx.symbols @@ -1,5 +1,5 @@ === tests/cases/conformance/jsx/tsxNoJsx.tsx === -No type information for this code.; -No type information for this code. -No type information for this code. \ No newline at end of file +; +>nope : Symbol(unknown) + diff --git a/tests/baselines/reference/tsxTypeErrors.symbols b/tests/baselines/reference/tsxTypeErrors.symbols index 94399b95d1f..2b87e994477 100644 --- a/tests/baselines/reference/tsxTypeErrors.symbols +++ b/tests/baselines/reference/tsxTypeErrors.symbols @@ -3,11 +3,13 @@ // A built-in element (OK) var a1 =
; >a1 : Symbol(a1, Decl(tsxTypeErrors.tsx, 2, 3)) +>div : Symbol(unknown) >id : Symbol(unknown) // A built-in element with a mistyped property (error) var a2 = >a2 : Symbol(a2, Decl(tsxTypeErrors.tsx, 5, 3)) +>img : Symbol(unknown) >srce : Symbol(unknown) // A built-in element with a badly-typed attribute value (error) @@ -17,12 +19,14 @@ var thing = { oops: 100 }; var a3 =
>a3 : Symbol(a3, Decl(tsxTypeErrors.tsx, 9, 3)) +>div : Symbol(unknown) >id : Symbol(unknown) >thing : Symbol(thing, Decl(tsxTypeErrors.tsx, 8, 3)) // Mistyped html name (error) var e1 = >e1 : Symbol(e1, Decl(tsxTypeErrors.tsx, 12, 3)) +>imag : Symbol(unknown) >src : Symbol(unknown) // A custom type From 03c8d2f29325469993a2a53b2c971d01d06ab31b Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 10 Dec 2015 11:42:20 -0800 Subject: [PATCH 4/9] Rename parameter --- src/compiler/checker.ts | 4 ++-- src/compiler/types.ts | 2 +- src/services/services.ts | 14 ++++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f02520b24fd..6077e76ed04 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14576,7 +14576,7 @@ namespace ts { return false; } - function getSymbolsInScope(location: Node, meaning: SymbolFlags, includeAllGlobalSymbols: boolean): Symbol[] { + function getSymbolsInScope(location: Node, meaning: SymbolFlags, includeGlobalSymbols: boolean): Symbol[] { const symbols: SymbolTable = {}; let memberFlags: NodeFlags = 0; @@ -14639,7 +14639,7 @@ namespace ts { location = location.parent; } - if (includeAllGlobalSymbols) { + if (includeGlobalSymbols) { copySymbols(globals, meaning); } } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index eb93ceee093..9cec9dda241 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1717,7 +1717,7 @@ namespace ts { getBaseTypes(type: InterfaceType): ObjectType[]; getReturnTypeOfSignature(signature: Signature): Type; - getSymbolsInScope(location: Node, meaning: SymbolFlags, includeAllGlobalSymbols: boolean): Symbol[]; + getSymbolsInScope(location: Node, meaning: SymbolFlags, includeGlobalSymbols: boolean): Symbol[]; getSymbolAtLocation(node: Node): Symbol; getShorthandAssignmentValueSymbol(location: Node): Symbol; getTypeAtLocation(node: Node): Type; diff --git a/src/services/services.ts b/src/services/services.ts index 7e12a521a4d..552af68ce40 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3114,9 +3114,11 @@ namespace ts { } else if (isRightOfOpenTag) { let tagSymbols = typeChecker.getJsxIntrinsicTagNames(); - // If the currect cursor is inside JSX opening tag, the only meaningful completions are those of JSX.IntrinsicElements or users defined React.Component - // If the services can't find those symbols, then show nothing instead of including all the global symbols in the completion list. - if (tryGetGlobalSymbols(/*includeAllGlobalSymbols*/false)) { + // In this case, we are handling completion list inside JSX opening tag. For example: + // !!(s.flags & SymbolFlags.Value))); } else { @@ -3140,7 +3142,7 @@ namespace ts { // For JavaScript or TypeScript, if we're not after a dot, then just try to get the // global symbols in scope. These results should be valid for either language as // the set of symbols that can be referenced from this location. - if (!tryGetGlobalSymbols(/*includeAllGlobalSymbols*/true)) { + if (!tryGetGlobalSymbols(/*includeGlobalSymbols*/ true)) { return undefined; } } @@ -3200,7 +3202,7 @@ namespace ts { } } - function tryGetGlobalSymbols(includeAllGlobalSymbols: boolean): boolean { + function tryGetGlobalSymbols(includeGlobalSymbols: boolean): boolean { let objectLikeContainer: ObjectLiteralExpression | BindingPattern; let namedImportsOrExports: NamedImportsOrExports; let jsxContainer: JsxOpeningLikeElement; @@ -3271,7 +3273,7 @@ namespace ts { /// TODO filter meaning based on the current context let symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; - symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings, includeAllGlobalSymbols); + symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings, includeGlobalSymbols); return true; } From 59982aba224075cec05a7b365dc11adcc3cc0155 Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 10 Dec 2015 17:35:10 -0800 Subject: [PATCH 5/9] Update testcases --- tests/cases/fourslash/tsxCompletion11.ts | 7 ----- tests/cases/fourslash/tsxCompletion13.ts | 8 ----- tests/cases/fourslash/tsxCompletion14.ts | 8 ----- tests/cases/fourslash/tsxCompletion15.ts | 9 ------ tests/cases/fourslash/tsxCompletion16.ts | 7 ----- tests/cases/fourslash/tsxCompletion17.ts | 8 ----- tests/cases/fourslash/tsxCompletion18.ts | 30 ------------------- ...ion12.ts => tsxCompletionOnClosingTag1.ts} | 0 .../fourslash/tsxCompletionOnClosingTag2.ts | 14 +++++++++ .../fourslash/tsxCompletionOnClosingTag3.ts | 20 +++++++++++++ .../fourslash/tsxCompletionOnClosingTag4.ts | 14 +++++++++ 11 files changed, 48 insertions(+), 77 deletions(-) delete mode 100644 tests/cases/fourslash/tsxCompletion11.ts delete mode 100644 tests/cases/fourslash/tsxCompletion13.ts delete mode 100644 tests/cases/fourslash/tsxCompletion14.ts delete mode 100644 tests/cases/fourslash/tsxCompletion15.ts delete mode 100644 tests/cases/fourslash/tsxCompletion16.ts delete mode 100644 tests/cases/fourslash/tsxCompletion17.ts delete mode 100644 tests/cases/fourslash/tsxCompletion18.ts rename tests/cases/fourslash/{tsxCompletion12.ts => tsxCompletionOnClosingTag1.ts} (100%) create mode 100644 tests/cases/fourslash/tsxCompletionOnClosingTag2.ts create mode 100644 tests/cases/fourslash/tsxCompletionOnClosingTag3.ts create mode 100644 tests/cases/fourslash/tsxCompletionOnClosingTag4.ts diff --git a/tests/cases/fourslash/tsxCompletion11.ts b/tests/cases/fourslash/tsxCompletion11.ts deleted file mode 100644 index 70626a84791..00000000000 --- a/tests/cases/fourslash/tsxCompletion11.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// - -//@Filename: file.tsx -//// var x1 = - -//@Filename: file.tsx -//// class MyElement {} -//// var x1 = - -//@Filename: file.tsx -//// class MyElement {} -//// var x1 = - -//@Filename: file.tsx -//// class MyElement {} -//// var x1 = - -//@Filename: file.tsx -//// var x1 = - -//@Filename: file.tsx -//// var x1 = - -//@Filename: file.tsx -//// var x =
-////

-//// -//// -//// - -goTo.marker("1"); -verify.memberListCount(1); -verify.completionListContains('h1'); - -goTo.marker("2"); -verify.memberListCount(1); -verify.completionListContains('div'); - -goTo.marker("3"); -verify.memberListCount(0); - -goTo.marker("4"); -verify.memberListCount(1); -verify.completionListContains('div'); - -goTo.marker("5"); -verify.memberListCount(0); - -goTo.marker("6"); -verify.memberListCount(1); -verify.completionListContains('div'); \ No newline at end of file diff --git a/tests/cases/fourslash/tsxCompletion12.ts b/tests/cases/fourslash/tsxCompletionOnClosingTag1.ts similarity index 100% rename from tests/cases/fourslash/tsxCompletion12.ts rename to tests/cases/fourslash/tsxCompletionOnClosingTag1.ts diff --git a/tests/cases/fourslash/tsxCompletionOnClosingTag2.ts b/tests/cases/fourslash/tsxCompletionOnClosingTag2.ts new file mode 100644 index 00000000000..54a0b61879f --- /dev/null +++ b/tests/cases/fourslash/tsxCompletionOnClosingTag2.ts @@ -0,0 +1,14 @@ +/// + +//@Filename: file.tsx +//// declare module JSX { +//// interface Element { } +//// interface IntrinsicElements { +//// div: { ONE: string; TWO: number; } +//// } +//// } +//// var x1 =
+ +//@Filename: file.tsx +//// declare module JSX { +//// interface Element { } +//// interface IntrinsicElements { +//// div: { ONE: string; TWO: number; } +//// } +//// } +//// var x1 =
+////

Hello world +//// + +goTo.marker("1"); +verify.memberListCount(1); +verify.completionListContains('div'); + +goTo.marker("2"); +verify.memberListCount(1); +verify.completionListContains('h1') diff --git a/tests/cases/fourslash/tsxCompletionOnClosingTag4.ts b/tests/cases/fourslash/tsxCompletionOnClosingTag4.ts new file mode 100644 index 00000000000..a36a933127d --- /dev/null +++ b/tests/cases/fourslash/tsxCompletionOnClosingTag4.ts @@ -0,0 +1,14 @@ +/// + +//@Filename: file.tsx +//// var x1 =
+////

Hello world +//// + +goTo.marker("1"); +verify.memberListCount(1); +verify.completionListContains('div'); + +goTo.marker("2"); +verify.memberListCount(1); +verify.completionListContains('h1') From 9e6c196c36ce70178e0f4adc8bc4046fb8978266 Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 10 Dec 2015 18:09:02 -0800 Subject: [PATCH 6/9] Remove includeGlobalSymbol boolean --- src/compiler/checker.ts | 6 ++---- src/compiler/types.ts | 2 +- src/services/services.ts | 13 +++++-------- tests/cases/fourslash/tsxCompletionOnClosingTag3.ts | 2 +- tests/cases/fourslash/tsxCompletionOnClosingTag4.ts | 2 +- 5 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6077e76ed04..16b598ec211 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14576,7 +14576,7 @@ namespace ts { return false; } - function getSymbolsInScope(location: Node, meaning: SymbolFlags, includeGlobalSymbols: boolean): Symbol[] { + function getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[] { const symbols: SymbolTable = {}; let memberFlags: NodeFlags = 0; @@ -14639,9 +14639,7 @@ namespace ts { location = location.parent; } - if (includeGlobalSymbols) { - copySymbols(globals, meaning); - } + copySymbols(globals, meaning); } /** diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 9cec9dda241..0cb182e378b 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1717,7 +1717,7 @@ namespace ts { getBaseTypes(type: InterfaceType): ObjectType[]; getReturnTypeOfSignature(signature: Signature): Type; - getSymbolsInScope(location: Node, meaning: SymbolFlags, includeGlobalSymbols: boolean): Symbol[]; + getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[]; getSymbolAtLocation(node: Node): Symbol; getShorthandAssignmentValueSymbol(location: Node): Symbol; getTypeAtLocation(node: Node): Type; diff --git a/src/services/services.ts b/src/services/services.ts index 552af68ce40..6e8aa237f47 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3114,11 +3114,8 @@ namespace ts { } else if (isRightOfOpenTag) { let tagSymbols = typeChecker.getJsxIntrinsicTagNames(); - // In this case, we are handling completion list inside JSX opening tag. For example: - // !!(s.flags & SymbolFlags.Value))); } else { @@ -3142,7 +3139,7 @@ namespace ts { // For JavaScript or TypeScript, if we're not after a dot, then just try to get the // global symbols in scope. These results should be valid for either language as // the set of symbols that can be referenced from this location. - if (!tryGetGlobalSymbols(/*includeGlobalSymbols*/ true)) { + if (!tryGetGlobalSymbols()) { return undefined; } } @@ -3202,7 +3199,7 @@ namespace ts { } } - function tryGetGlobalSymbols(includeGlobalSymbols: boolean): boolean { + function tryGetGlobalSymbols(): boolean { let objectLikeContainer: ObjectLiteralExpression | BindingPattern; let namedImportsOrExports: NamedImportsOrExports; let jsxContainer: JsxOpeningLikeElement; @@ -3273,7 +3270,7 @@ namespace ts { /// TODO filter meaning based on the current context let symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; - symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings, includeGlobalSymbols); + symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings); return true; } diff --git a/tests/cases/fourslash/tsxCompletionOnClosingTag3.ts b/tests/cases/fourslash/tsxCompletionOnClosingTag3.ts index 80d2b0c00ba..a39740df586 100644 --- a/tests/cases/fourslash/tsxCompletionOnClosingTag3.ts +++ b/tests/cases/fourslash/tsxCompletionOnClosingTag3.ts @@ -9,7 +9,7 @@ //// } //// var x1 =
////

Hello world -//// +//// goTo.marker("1"); verify.memberListCount(1); diff --git a/tests/cases/fourslash/tsxCompletionOnClosingTag4.ts b/tests/cases/fourslash/tsxCompletionOnClosingTag4.ts index a36a933127d..04176ba7fcb 100644 --- a/tests/cases/fourslash/tsxCompletionOnClosingTag4.ts +++ b/tests/cases/fourslash/tsxCompletionOnClosingTag4.ts @@ -3,7 +3,7 @@ //@Filename: file.tsx //// var x1 =
////

Hello world -//// +//// goTo.marker("1"); verify.memberListCount(1); From 15ac9b32abf66acff66cdeb78c0718b55386d29f Mon Sep 17 00:00:00 2001 From: Yui T Date: Fri, 11 Dec 2015 14:12:57 -0800 Subject: [PATCH 7/9] Update tests --- .../fourslash/tsxCompletionOnClosingTag1.ts | 6 ++++++ .../fourslash/tsxCompletionOnClosingTag2.ts | 12 ++++++++--- .../fourslash/tsxCompletionOnClosingTag3.ts | 20 ------------------- .../tsxCompletionOnClosingTagWithoutJSX1.ts | 8 ++++++++ ...> tsxCompletionOnClosingTagWithoutJSX2.ts} | 0 .../tsxCompletionOnOpeningTagWithoutJSX1.ts | 8 ++++++++ 6 files changed, 31 insertions(+), 23 deletions(-) delete mode 100644 tests/cases/fourslash/tsxCompletionOnClosingTag3.ts create mode 100644 tests/cases/fourslash/tsxCompletionOnClosingTagWithoutJSX1.ts rename tests/cases/fourslash/{tsxCompletionOnClosingTag4.ts => tsxCompletionOnClosingTagWithoutJSX2.ts} (100%) create mode 100644 tests/cases/fourslash/tsxCompletionOnOpeningTagWithoutJSX1.ts diff --git a/tests/cases/fourslash/tsxCompletionOnClosingTag1.ts b/tests/cases/fourslash/tsxCompletionOnClosingTag1.ts index 742009b487e..54a0b61879f 100644 --- a/tests/cases/fourslash/tsxCompletionOnClosingTag1.ts +++ b/tests/cases/fourslash/tsxCompletionOnClosingTag1.ts @@ -1,6 +1,12 @@ /// //@Filename: file.tsx +//// declare module JSX { +//// interface Element { } +//// interface IntrinsicElements { +//// div: { ONE: string; TWO: number; } +//// } +//// } //// var x1 =
+////

Hello world +//// -goTo.marker(); +goTo.marker("1"); verify.memberListCount(1); -verify.completionListContains('div'); \ No newline at end of file +verify.completionListContains('div'); + +goTo.marker("2"); +verify.memberListCount(1); +verify.completionListContains('h1') diff --git a/tests/cases/fourslash/tsxCompletionOnClosingTag3.ts b/tests/cases/fourslash/tsxCompletionOnClosingTag3.ts deleted file mode 100644 index a39740df586..00000000000 --- a/tests/cases/fourslash/tsxCompletionOnClosingTag3.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// - -//@Filename: file.tsx -//// declare module JSX { -//// interface Element { } -//// interface IntrinsicElements { -//// div: { ONE: string; TWO: number; } -//// } -//// } -//// var x1 =
-////

Hello world -//// - -goTo.marker("1"); -verify.memberListCount(1); -verify.completionListContains('div'); - -goTo.marker("2"); -verify.memberListCount(1); -verify.completionListContains('h1') diff --git a/tests/cases/fourslash/tsxCompletionOnClosingTagWithoutJSX1.ts b/tests/cases/fourslash/tsxCompletionOnClosingTagWithoutJSX1.ts new file mode 100644 index 00000000000..742009b487e --- /dev/null +++ b/tests/cases/fourslash/tsxCompletionOnClosingTagWithoutJSX1.ts @@ -0,0 +1,8 @@ +/// + +//@Filename: file.tsx +//// var x1 =
+ +//@Filename: file.tsx +//// var x =
Date: Mon, 14 Dec 2015 15:03:16 -0800 Subject: [PATCH 8/9] Fix up fourslash test --- .../cases/fourslash/tsxCompletionOnOpeningTagWithoutJSX1.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/cases/fourslash/tsxCompletionOnOpeningTagWithoutJSX1.ts b/tests/cases/fourslash/tsxCompletionOnOpeningTagWithoutJSX1.ts index 43312ade6b2..1b745f6e418 100644 --- a/tests/cases/fourslash/tsxCompletionOnOpeningTagWithoutJSX1.ts +++ b/tests/cases/fourslash/tsxCompletionOnOpeningTagWithoutJSX1.ts @@ -1,8 +1,7 @@ /// //@Filename: file.tsx -//// var x =
Date: Sun, 10 Jan 2016 06:04:07 -0800 Subject: [PATCH 9/9] update baseline from merging --- .../reference/reactNamespaceImportPresevation.symbols | 1 + tests/baselines/reference/reactNamespaceJSXEmit.symbols | 3 +++ 2 files changed, 4 insertions(+) diff --git a/tests/baselines/reference/reactNamespaceImportPresevation.symbols b/tests/baselines/reference/reactNamespaceImportPresevation.symbols index 8a4407c8160..e2f530d31ba 100644 --- a/tests/baselines/reference/reactNamespaceImportPresevation.symbols +++ b/tests/baselines/reference/reactNamespaceImportPresevation.symbols @@ -16,5 +16,6 @@ declare var foo: any; >foo : Symbol(foo, Decl(test.tsx, 1, 11)) ; +>foo : Symbol(unknown) >data : Symbol(unknown) diff --git a/tests/baselines/reference/reactNamespaceJSXEmit.symbols b/tests/baselines/reference/reactNamespaceJSXEmit.symbols index d79c1cf531e..3ca5b91e538 100644 --- a/tests/baselines/reference/reactNamespaceJSXEmit.symbols +++ b/tests/baselines/reference/reactNamespaceJSXEmit.symbols @@ -13,6 +13,7 @@ declare var x: any; >x : Symbol(x, Decl(reactNamespaceJSXEmit.tsx, 4, 11)) ; +>foo : Symbol(unknown) >data : Symbol(unknown) ; @@ -21,6 +22,8 @@ declare var x: any; >x : Symbol(x, Decl(reactNamespaceJSXEmit.tsx, 4, 11)) ; +>x-component : Symbol(unknown) + ; >Bar : Symbol(Bar, Decl(reactNamespaceJSXEmit.tsx, 3, 11)) >x : Symbol(x, Decl(reactNamespaceJSXEmit.tsx, 4, 11))