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