Skip to content

Commit a54f974

Browse files
committed
Merge pull request #1128 from Microsoft/proto
Fix services and compiler to handle __proto
2 parents 7a5c360 + 37d8499 commit a54f974

10 files changed

+351
-12
lines changed

src/compiler/parser.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,7 @@ module ts {
11581158
}
11591159

11601160
function internIdentifier(text: string): string {
1161+
text = escapeIdentifier(text);
11611162
return hasProperty(identifiers, text) ? identifiers[text] : (identifiers[text] = text);
11621163
}
11631164

@@ -1168,8 +1169,7 @@ module ts {
11681169
identifierCount++;
11691170
if (isIdentifier) {
11701171
var node = <Identifier>createNode(SyntaxKind.Identifier);
1171-
var text = escapeIdentifier(scanner.getTokenValue());
1172-
node.text = internIdentifier(text);
1172+
node.text = internIdentifier(scanner.getTokenValue());
11731173
nextToken();
11741174
return finishNode(node);
11751175
}

src/services/services.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -2385,7 +2385,7 @@ module ts {
23852385

23862386

23872387
if (isValid) {
2388-
return displayName;
2388+
return unescapeIdentifier(displayName);
23892389
}
23902390
}
23912391

@@ -2561,9 +2561,12 @@ module ts {
25612561
var start = new Date().getTime();
25622562
forEach(symbols, symbol => {
25632563
var entry = createCompletionEntry(symbol, session.typeChecker, location);
2564-
if (entry && !lookUp(session.symbols, entry.name)) {
2565-
session.entries.push(entry);
2566-
session.symbols[entry.name] = symbol;
2564+
if (entry) {
2565+
var id = escapeIdentifier(entry.name);
2566+
if (!lookUp(session.symbols, id)) {
2567+
session.entries.push(entry);
2568+
session.symbols[id] = symbol;
2569+
}
25672570
}
25682571
});
25692572
host.log("getCompletionsAtPosition: getCompletionEntriesFromSymbols: " + (new Date().getTime() - start));
@@ -2771,7 +2774,7 @@ module ts {
27712774
return undefined;
27722775
}
27732776

2774-
var symbol = lookUp(activeCompletionSession.symbols, entryName);
2777+
var symbol = lookUp(activeCompletionSession.symbols, escapeIdentifier(entryName));
27752778
if (symbol) {
27762779
var location = getTouchingPropertyName(sourceFile, position);
27772780
var completionEntry = createCompletionEntry(symbol, session.typeChecker, location);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
//// [escapedReservedCompilerNamedIdentifier.ts]
2+
// double underscores
3+
var __proto__ = 10;
4+
var o = {
5+
"__proto__": 0
6+
};
7+
var b = o["__proto__"];
8+
var o1 = {
9+
__proto__: 0
10+
};
11+
var b1 = o1["__proto__"];
12+
// Triple underscores
13+
var ___proto__ = 10;
14+
var o2 = {
15+
"___proto__": 0
16+
};
17+
var b2 = o2["___proto__"];
18+
var o3 = {
19+
___proto__: 0
20+
};
21+
var b3 = o3["___proto__"];
22+
// One underscore
23+
var _proto__ = 10;
24+
var o4 = {
25+
"_proto__": 0
26+
};
27+
var b4 = o4["_proto__"];
28+
var o5 = {
29+
_proto__: 0
30+
};
31+
var b5 = o5["_proto__"];
32+
33+
//// [escapedReservedCompilerNamedIdentifier.js]
34+
// double underscores
35+
var __proto__ = 10;
36+
var o = {
37+
"__proto__": 0
38+
};
39+
var b = o["__proto__"];
40+
var o1 = {
41+
__proto__: 0
42+
};
43+
var b1 = o1["__proto__"];
44+
// Triple underscores
45+
var ___proto__ = 10;
46+
var o2 = {
47+
"___proto__": 0
48+
};
49+
var b2 = o2["___proto__"];
50+
var o3 = {
51+
___proto__: 0
52+
};
53+
var b3 = o3["___proto__"];
54+
// One underscore
55+
var _proto__ = 10;
56+
var o4 = {
57+
"_proto__": 0
58+
};
59+
var b4 = o4["_proto__"];
60+
var o5 = {
61+
_proto__: 0
62+
};
63+
var b5 = o5["_proto__"];
64+
65+
66+
//// [escapedReservedCompilerNamedIdentifier.d.ts]
67+
declare var __proto__: number;
68+
declare var o: {
69+
"__proto__": number;
70+
};
71+
declare var b: number;
72+
declare var o1: {
73+
__proto__: number;
74+
};
75+
declare var b1: number;
76+
declare var ___proto__: number;
77+
declare var o2: {
78+
"___proto__": number;
79+
};
80+
declare var b2: number;
81+
declare var o3: {
82+
___proto__: number;
83+
};
84+
declare var b3: number;
85+
declare var _proto__: number;
86+
declare var o4: {
87+
"_proto__": number;
88+
};
89+
declare var b4: number;
90+
declare var o5: {
91+
_proto__: number;
92+
};
93+
declare var b5: number;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
=== tests/cases/compiler/escapedReservedCompilerNamedIdentifier.ts ===
2+
// double underscores
3+
var __proto__ = 10;
4+
>__proto__ : number
5+
6+
var o = {
7+
>o : { "__proto__": number; }
8+
>{ "__proto__": 0} : { "__proto__": number; }
9+
10+
"__proto__": 0
11+
};
12+
var b = o["__proto__"];
13+
>b : number
14+
>o["__proto__"] : number
15+
>o : { "__proto__": number; }
16+
17+
var o1 = {
18+
>o1 : { __proto__: number; }
19+
>{ __proto__: 0} : { __proto__: number; }
20+
21+
__proto__: 0
22+
>__proto__ : number
23+
24+
};
25+
var b1 = o1["__proto__"];
26+
>b1 : number
27+
>o1["__proto__"] : number
28+
>o1 : { __proto__: number; }
29+
30+
// Triple underscores
31+
var ___proto__ = 10;
32+
>___proto__ : number
33+
34+
var o2 = {
35+
>o2 : { "___proto__": number; }
36+
>{ "___proto__": 0} : { "___proto__": number; }
37+
38+
"___proto__": 0
39+
};
40+
var b2 = o2["___proto__"];
41+
>b2 : number
42+
>o2["___proto__"] : number
43+
>o2 : { "___proto__": number; }
44+
45+
var o3 = {
46+
>o3 : { ___proto__: number; }
47+
>{ ___proto__: 0} : { ___proto__: number; }
48+
49+
___proto__: 0
50+
>___proto__ : number
51+
52+
};
53+
var b3 = o3["___proto__"];
54+
>b3 : number
55+
>o3["___proto__"] : number
56+
>o3 : { ___proto__: number; }
57+
58+
// One underscore
59+
var _proto__ = 10;
60+
>_proto__ : number
61+
62+
var o4 = {
63+
>o4 : { "_proto__": number; }
64+
>{ "_proto__": 0} : { "_proto__": number; }
65+
66+
"_proto__": 0
67+
};
68+
var b4 = o4["_proto__"];
69+
>b4 : number
70+
>o4["_proto__"] : number
71+
>o4 : { "_proto__": number; }
72+
73+
var o5 = {
74+
>o5 : { _proto__: number; }
75+
>{ _proto__: 0} : { _proto__: number; }
76+
77+
_proto__: 0
78+
>_proto__ : number
79+
80+
};
81+
var b5 = o5["_proto__"];
82+
>b5 : number
83+
>o5["_proto__"] : number
84+
>o5 : { _proto__: number; }
85+

tests/baselines/reference/protoAsIndexInIndexExpression.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ WorkspacePrototype['__proto__'] = EntityPrototype;
2020
>EntityPrototype : any
2121

2222
var o = {
23-
>o : {}
24-
>{ "__proto__": 0} : {}
23+
>o : { "__proto__": number; }
24+
>{ "__proto__": 0} : { "__proto__": number; }
2525

2626
"__proto__": 0
2727
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//@declaration: true
2+
// double underscores
3+
var __proto__ = 10;
4+
var o = {
5+
"__proto__": 0
6+
};
7+
var b = o["__proto__"];
8+
var o1 = {
9+
__proto__: 0
10+
};
11+
var b1 = o1["__proto__"];
12+
// Triple underscores
13+
var ___proto__ = 10;
14+
var o2 = {
15+
"___proto__": 0
16+
};
17+
var b2 = o2["___proto__"];
18+
var o3 = {
19+
___proto__: 0
20+
};
21+
var b3 = o3["___proto__"];
22+
// One underscore
23+
var _proto__ = 10;
24+
var o4 = {
25+
"_proto__": 0
26+
};
27+
var b4 = o4["_proto__"];
28+
var o5 = {
29+
_proto__: 0
30+
};
31+
var b5 = o5["_proto__"];

tests/cases/fourslash/proto.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ verify.quickInfoIs("interface M.__proto__", "");
1212
goTo.marker('2');
1313
verify.quickInfoIs("(var) __proto__: M.__proto__", "");
1414
goTo.marker('3');
15-
//verify.completionListContains("__proto__", "(var) __proto__: M.__proto__", "");
15+
verify.completionListContains("__proto__", "(var) __proto__: M.__proto__", "");
1616
edit.insert("__proto__");
17-
//goTo.definition();
18-
//verify.caretAtMarker('2');
17+
goTo.definition();
18+
verify.caretAtMarker('2');
1919
goTo.marker('4');
2020
verify.quickInfoIs("(var) fun: (__proto__: any) => boolean", "");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////var o1 = {
4+
//// "__proto__": 10
5+
////};
6+
////var o2 = {
7+
//// __proto__: 10
8+
////};
9+
////o1./*1*/
10+
////o2./*2*/
11+
12+
goTo.marker('1');
13+
verify.completionListContains("__proto__", '(property) "__proto__": number');
14+
edit.insert("__proto__ = 10;");
15+
goTo.marker('1');
16+
verify.quickInfoIs('(property) "__proto__": number');
17+
goTo.marker('2');
18+
verify.completionListContains("__proto__", '(property) __proto__: number');
19+
edit.insert("__proto__ = 10;");
20+
goTo.marker('2');
21+
verify.quickInfoIs('(property) __proto__: number');

0 commit comments

Comments
 (0)