mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-07-04 14:56:16 -05:00
Merge pull request #1128 from Microsoft/proto
Fix services and compiler to handle __proto
This commit is contained in:
@@ -1158,6 +1158,7 @@ module ts {
|
||||
}
|
||||
|
||||
function internIdentifier(text: string): string {
|
||||
text = escapeIdentifier(text);
|
||||
return hasProperty(identifiers, text) ? identifiers[text] : (identifiers[text] = text);
|
||||
}
|
||||
|
||||
@@ -1168,8 +1169,7 @@ module ts {
|
||||
identifierCount++;
|
||||
if (isIdentifier) {
|
||||
var node = <Identifier>createNode(SyntaxKind.Identifier);
|
||||
var text = escapeIdentifier(scanner.getTokenValue());
|
||||
node.text = internIdentifier(text);
|
||||
node.text = internIdentifier(scanner.getTokenValue());
|
||||
nextToken();
|
||||
return finishNode(node);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
//// [escapedReservedCompilerNamedIdentifier.ts]
|
||||
// double underscores
|
||||
var __proto__ = 10;
|
||||
var o = {
|
||||
"__proto__": 0
|
||||
};
|
||||
var b = o["__proto__"];
|
||||
var o1 = {
|
||||
__proto__: 0
|
||||
};
|
||||
var b1 = o1["__proto__"];
|
||||
// Triple underscores
|
||||
var ___proto__ = 10;
|
||||
var o2 = {
|
||||
"___proto__": 0
|
||||
};
|
||||
var b2 = o2["___proto__"];
|
||||
var o3 = {
|
||||
___proto__: 0
|
||||
};
|
||||
var b3 = o3["___proto__"];
|
||||
// One underscore
|
||||
var _proto__ = 10;
|
||||
var o4 = {
|
||||
"_proto__": 0
|
||||
};
|
||||
var b4 = o4["_proto__"];
|
||||
var o5 = {
|
||||
_proto__: 0
|
||||
};
|
||||
var b5 = o5["_proto__"];
|
||||
|
||||
//// [escapedReservedCompilerNamedIdentifier.js]
|
||||
// double underscores
|
||||
var __proto__ = 10;
|
||||
var o = {
|
||||
"__proto__": 0
|
||||
};
|
||||
var b = o["__proto__"];
|
||||
var o1 = {
|
||||
__proto__: 0
|
||||
};
|
||||
var b1 = o1["__proto__"];
|
||||
// Triple underscores
|
||||
var ___proto__ = 10;
|
||||
var o2 = {
|
||||
"___proto__": 0
|
||||
};
|
||||
var b2 = o2["___proto__"];
|
||||
var o3 = {
|
||||
___proto__: 0
|
||||
};
|
||||
var b3 = o3["___proto__"];
|
||||
// One underscore
|
||||
var _proto__ = 10;
|
||||
var o4 = {
|
||||
"_proto__": 0
|
||||
};
|
||||
var b4 = o4["_proto__"];
|
||||
var o5 = {
|
||||
_proto__: 0
|
||||
};
|
||||
var b5 = o5["_proto__"];
|
||||
|
||||
|
||||
//// [escapedReservedCompilerNamedIdentifier.d.ts]
|
||||
declare var __proto__: number;
|
||||
declare var o: {
|
||||
"__proto__": number;
|
||||
};
|
||||
declare var b: number;
|
||||
declare var o1: {
|
||||
__proto__: number;
|
||||
};
|
||||
declare var b1: number;
|
||||
declare var ___proto__: number;
|
||||
declare var o2: {
|
||||
"___proto__": number;
|
||||
};
|
||||
declare var b2: number;
|
||||
declare var o3: {
|
||||
___proto__: number;
|
||||
};
|
||||
declare var b3: number;
|
||||
declare var _proto__: number;
|
||||
declare var o4: {
|
||||
"_proto__": number;
|
||||
};
|
||||
declare var b4: number;
|
||||
declare var o5: {
|
||||
_proto__: number;
|
||||
};
|
||||
declare var b5: number;
|
||||
@@ -0,0 +1,85 @@
|
||||
=== tests/cases/compiler/escapedReservedCompilerNamedIdentifier.ts ===
|
||||
// double underscores
|
||||
var __proto__ = 10;
|
||||
>__proto__ : number
|
||||
|
||||
var o = {
|
||||
>o : { "__proto__": number; }
|
||||
>{ "__proto__": 0} : { "__proto__": number; }
|
||||
|
||||
"__proto__": 0
|
||||
};
|
||||
var b = o["__proto__"];
|
||||
>b : number
|
||||
>o["__proto__"] : number
|
||||
>o : { "__proto__": number; }
|
||||
|
||||
var o1 = {
|
||||
>o1 : { __proto__: number; }
|
||||
>{ __proto__: 0} : { __proto__: number; }
|
||||
|
||||
__proto__: 0
|
||||
>__proto__ : number
|
||||
|
||||
};
|
||||
var b1 = o1["__proto__"];
|
||||
>b1 : number
|
||||
>o1["__proto__"] : number
|
||||
>o1 : { __proto__: number; }
|
||||
|
||||
// Triple underscores
|
||||
var ___proto__ = 10;
|
||||
>___proto__ : number
|
||||
|
||||
var o2 = {
|
||||
>o2 : { "___proto__": number; }
|
||||
>{ "___proto__": 0} : { "___proto__": number; }
|
||||
|
||||
"___proto__": 0
|
||||
};
|
||||
var b2 = o2["___proto__"];
|
||||
>b2 : number
|
||||
>o2["___proto__"] : number
|
||||
>o2 : { "___proto__": number; }
|
||||
|
||||
var o3 = {
|
||||
>o3 : { ___proto__: number; }
|
||||
>{ ___proto__: 0} : { ___proto__: number; }
|
||||
|
||||
___proto__: 0
|
||||
>___proto__ : number
|
||||
|
||||
};
|
||||
var b3 = o3["___proto__"];
|
||||
>b3 : number
|
||||
>o3["___proto__"] : number
|
||||
>o3 : { ___proto__: number; }
|
||||
|
||||
// One underscore
|
||||
var _proto__ = 10;
|
||||
>_proto__ : number
|
||||
|
||||
var o4 = {
|
||||
>o4 : { "_proto__": number; }
|
||||
>{ "_proto__": 0} : { "_proto__": number; }
|
||||
|
||||
"_proto__": 0
|
||||
};
|
||||
var b4 = o4["_proto__"];
|
||||
>b4 : number
|
||||
>o4["_proto__"] : number
|
||||
>o4 : { "_proto__": number; }
|
||||
|
||||
var o5 = {
|
||||
>o5 : { _proto__: number; }
|
||||
>{ _proto__: 0} : { _proto__: number; }
|
||||
|
||||
_proto__: 0
|
||||
>_proto__ : number
|
||||
|
||||
};
|
||||
var b5 = o5["_proto__"];
|
||||
>b5 : number
|
||||
>o5["_proto__"] : number
|
||||
>o5 : { _proto__: number; }
|
||||
|
||||
@@ -20,8 +20,8 @@ WorkspacePrototype['__proto__'] = EntityPrototype;
|
||||
>EntityPrototype : any
|
||||
|
||||
var o = {
|
||||
>o : {}
|
||||
>{ "__proto__": 0} : {}
|
||||
>o : { "__proto__": number; }
|
||||
>{ "__proto__": 0} : { "__proto__": number; }
|
||||
|
||||
"__proto__": 0
|
||||
};
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
//@declaration: true
|
||||
// double underscores
|
||||
var __proto__ = 10;
|
||||
var o = {
|
||||
"__proto__": 0
|
||||
};
|
||||
var b = o["__proto__"];
|
||||
var o1 = {
|
||||
__proto__: 0
|
||||
};
|
||||
var b1 = o1["__proto__"];
|
||||
// Triple underscores
|
||||
var ___proto__ = 10;
|
||||
var o2 = {
|
||||
"___proto__": 0
|
||||
};
|
||||
var b2 = o2["___proto__"];
|
||||
var o3 = {
|
||||
___proto__: 0
|
||||
};
|
||||
var b3 = o3["___proto__"];
|
||||
// One underscore
|
||||
var _proto__ = 10;
|
||||
var o4 = {
|
||||
"_proto__": 0
|
||||
};
|
||||
var b4 = o4["_proto__"];
|
||||
var o5 = {
|
||||
_proto__: 0
|
||||
};
|
||||
var b5 = o5["_proto__"];
|
||||
@@ -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", "");
|
||||
21
tests/cases/fourslash/protoPropertyInObjectLiteral.ts
Normal file
21
tests/cases/fourslash/protoPropertyInObjectLiteral.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
/// <reference path='fourslash.ts' />
|
||||
|
||||
////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');
|
||||
94
tests/cases/fourslash/protoVarInContexutalObjectLiteral.ts
Normal file
94
tests/cases/fourslash/protoVarInContexutalObjectLiteral.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
/// <reference path='fourslash.ts' />
|
||||
|
||||
////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');
|
||||
@@ -0,0 +1,12 @@
|
||||
/// <reference path='fourslash.ts' />
|
||||
|
||||
////// outer
|
||||
////var ___proto__ = 10;
|
||||
////function foo() {
|
||||
//// var __proto__ = "hello";
|
||||
//// /**/
|
||||
////}
|
||||
|
||||
goTo.marker('');
|
||||
verify.completionListContains("__proto__", '(local var) __proto__: string');
|
||||
verify.completionListContains("___proto__", '(var) ___proto__: number');
|
||||
Reference in New Issue
Block a user