diff --git a/src/services/services.ts b/src/services/services.ts index 506770e3f2d..800d63738f0 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2385,7 +2385,7 @@ module ts { if (isValid) { - return displayName; + return unescapeIdentifier(displayName); } } @@ -2561,9 +2561,12 @@ module ts { var start = new Date().getTime(); forEach(symbols, symbol => { var entry = createCompletionEntry(symbol, session.typeChecker, location); - if (entry && !lookUp(session.symbols, entry.name)) { - session.entries.push(entry); - session.symbols[entry.name] = symbol; + if (entry) { + var id = escapeIdentifier(entry.name); + if (!lookUp(session.symbols, id)) { + session.entries.push(entry); + session.symbols[id] = symbol; + } } }); host.log("getCompletionsAtPosition: getCompletionEntriesFromSymbols: " + (new Date().getTime() - start)); @@ -2771,7 +2774,7 @@ module ts { return undefined; } - var symbol = lookUp(activeCompletionSession.symbols, entryName); + var symbol = lookUp(activeCompletionSession.symbols, escapeIdentifier(entryName)); if (symbol) { var location = getTouchingPropertyName(sourceFile, position); var completionEntry = createCompletionEntry(symbol, session.typeChecker, location); diff --git a/tests/cases/fourslash/proto.ts b/tests/cases/fourslash/proto.ts index 73f23dea64f..cdb279b5009 100644 --- a/tests/cases/fourslash/proto.ts +++ b/tests/cases/fourslash/proto.ts @@ -12,9 +12,9 @@ verify.quickInfoIs("interface M.__proto__", ""); goTo.marker('2'); verify.quickInfoIs("(var) __proto__: M.__proto__", ""); goTo.marker('3'); -//verify.completionListContains("__proto__", "(var) __proto__: M.__proto__", ""); +verify.completionListContains("__proto__", "(var) __proto__: M.__proto__", ""); edit.insert("__proto__"); -//goTo.definition(); -//verify.caretAtMarker('2'); +goTo.definition(); +verify.caretAtMarker('2'); goTo.marker('4'); verify.quickInfoIs("(var) fun: (__proto__: any) => boolean", ""); \ No newline at end of file diff --git a/tests/cases/fourslash/protoPropertyInObjectLiteral.ts b/tests/cases/fourslash/protoPropertyInObjectLiteral.ts new file mode 100644 index 00000000000..8812f0adf62 --- /dev/null +++ b/tests/cases/fourslash/protoPropertyInObjectLiteral.ts @@ -0,0 +1,21 @@ +/// + +////var o1 = { +//// "__proto__": 10 +////}; +////var o2 = { +//// __proto__: 10 +////}; +////o1./*1*/ +////o2./*2*/ + +goTo.marker('1'); +verify.completionListContains("__proto__", '(property) "__proto__": number'); +edit.insert("__proto__ = 10;"); +goTo.marker('1'); +verify.quickInfoIs('(property) "__proto__": number'); +goTo.marker('2'); +verify.completionListContains("__proto__", '(property) __proto__: number'); +edit.insert("__proto__ = 10;"); +goTo.marker('2'); +verify.quickInfoIs('(property) __proto__: number'); \ No newline at end of file diff --git a/tests/cases/fourslash/protoVarInContexutalObjectLiteral.ts b/tests/cases/fourslash/protoVarInContexutalObjectLiteral.ts new file mode 100644 index 00000000000..cf76ba7c3cd --- /dev/null +++ b/tests/cases/fourslash/protoVarInContexutalObjectLiteral.ts @@ -0,0 +1,94 @@ +/// + +////var o1 : { +//// __proto__: number; +//// p: number; +////} = { +//// /*1*/ +//// }; +////var o2: { +//// __proto__: number; +//// p: number; +////} = { +//// /*2*/ +//// }; +////var o3: { +//// "__proto__": number; +//// p: number; +////} = { +//// /*3*/ +//// }; +////var o4: { +//// "__proto__": number; +//// p: number; +////} = { +//// /*4*/ +//// }; +////var o5: { +//// __proto__: number; +//// ___proto__: string; +//// p: number; +////} = { +//// /*5*/ +//// }; +////var o6: { +//// __proto__: number; +//// ___proto__: string; +//// p: number; +////} = { +//// /*6*/ +//// }; + +goTo.marker('1'); +verify.completionListContains("__proto__", '(property) __proto__: number'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('__proto__: 10,'); +verify.not.completionListContains("__proto__", '(property) __proto__: number'); +verify.completionListContains("p", '(property) p: number'); + +goTo.marker('2'); +verify.completionListContains("__proto__", '(property) __proto__: number'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('"__proto__": 10,'); +verify.not.completionListContains("__proto__", '(property) __proto__: number'); +verify.completionListContains("p", '(property) p: number'); + +goTo.marker('3'); +verify.completionListContains("__proto__", '(property) "__proto__": number'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('__proto__: 10,'); +verify.not.completionListContains("__proto__", '(property) "__proto__": number'); +verify.completionListContains("p", '(property) p: number'); + +goTo.marker('4'); +verify.completionListContains("__proto__", '(property) "__proto__": number'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('"__proto__": 10,'); +verify.not.completionListContains("__proto__", '(property) "__proto__": number'); +verify.completionListContains("p", '(property) p: number'); + +goTo.marker('5'); +verify.completionListContains("___proto__", '(property) ___proto__: string'); +verify.completionListContains("__proto__", '(property) __proto__: number'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('__proto__: 10,'); +verify.not.completionListContains("__proto__", '(property) __proto__: number'); +verify.completionListContains("___proto__", '(property) ___proto__: string'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('"___proto__": "10",'); +verify.not.completionListContains("__proto__", '(property) __proto__: number'); +verify.not.completionListContains("___proto__", '(property) ___proto__: string'); +verify.completionListContains("p", '(property) p: number'); + +goTo.marker('6'); +verify.completionListContains("___proto__", '(property) ___proto__: string'); +verify.completionListContains("__proto__", '(property) __proto__: number'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('___proto__: "10",'); +verify.completionListContains("__proto__", '(property) __proto__: number'); +verify.not.completionListContains("___proto__", '(property) ___proto__: string'); +verify.completionListContains("p", '(property) p: number'); +edit.insert('"__proto__": 10,'); +verify.not.completionListContains("__proto__", '(property) __proto__: number'); +verify.not.completionListContains("___proto__", '(property) ___proto__: string'); +verify.completionListContains("p", '(property) p: number'); \ No newline at end of file diff --git a/tests/cases/fourslash/protoVarVisibleWithOuterScopeUnderscoreProto.ts b/tests/cases/fourslash/protoVarVisibleWithOuterScopeUnderscoreProto.ts new file mode 100644 index 00000000000..a36f5ddbfe2 --- /dev/null +++ b/tests/cases/fourslash/protoVarVisibleWithOuterScopeUnderscoreProto.ts @@ -0,0 +1,12 @@ +/// + +////// outer +////var ___proto__ = 10; +////function foo() { +//// var __proto__ = "hello"; +//// /**/ +////} + +goTo.marker(''); +verify.completionListContains("__proto__", '(local var) __proto__: string'); +verify.completionListContains("___proto__", '(var) ___proto__: number'); \ No newline at end of file