@@ -1574,7 +1574,7 @@ module ts {
1574
1574
// invalid identifer name. We need to check if whatever was inside the quotes is actually a valid identifier name.
1575
1575
displayName = displayName . substring ( 1 , displayName . length - 1 ) ;
1576
1576
}
1577
-
1577
+
1578
1578
var isValid = isIdentifierStart ( displayName . charCodeAt ( 0 ) , target ) ;
1579
1579
for ( var i = 1 , n = displayName . length ; isValid && i < n ; i ++ ) {
1580
1580
isValid = isValid && isIdentifierPart ( displayName . charCodeAt ( i ) , target ) ;
@@ -1748,6 +1748,36 @@ module ts {
1748
1748
return ! ( declaration && declaration . flags & NodeFlags . Private && containingClass !== declaration . parent ) ;
1749
1749
}
1750
1750
1751
+ function filterContextualMembersList ( contextualMemberSymbols : Symbol [ ] , existingMembers : Declaration [ ] ) : Symbol [ ] {
1752
+ if ( ! existingMembers || existingMembers . length === 0 ) {
1753
+ return contextualMemberSymbols ;
1754
+ }
1755
+
1756
+ var existingMemberNames : Map < boolean > = { } ;
1757
+ forEach ( existingMembers , m => {
1758
+ if ( m . kind !== SyntaxKind . PropertyAssignment ) {
1759
+ // Ignore ommited expressions for missing members in the object literal
1760
+ return ;
1761
+ }
1762
+
1763
+ if ( position <= m . getEnd ( ) && position >= m . getStart ( ) ) {
1764
+ // If this is the current item we are editing right now, do not filter it out
1765
+ return ;
1766
+ }
1767
+
1768
+ existingMemberNames [ m . name . text ] = true ;
1769
+ } ) ;
1770
+
1771
+ var filteredMembers : Symbol [ ] = [ ] ;
1772
+ forEach ( contextualMemberSymbols , s => {
1773
+ if ( ! existingMemberNames [ s . name ] ) {
1774
+ filteredMembers . push ( s ) ;
1775
+ }
1776
+ } ) ;
1777
+
1778
+ return filteredMembers ;
1779
+ }
1780
+
1751
1781
synchronizeHostData ( ) ;
1752
1782
1753
1783
filename = TypeScript . switchToForwardSlashes ( filename ) ;
@@ -1855,34 +1885,23 @@ module ts {
1855
1885
1856
1886
// Object literal expression, look up possible property names from contextual type
1857
1887
if ( containingObjectLiteral ) {
1858
- var searchPosition = Math . min ( position , TypeScript . end ( containingObjectLiteral ) ) ;
1859
- var path = TypeScript . ASTHelpers . getAstAtPosition ( sourceUnit , searchPosition ) ;
1860
- // Get the object literal node
1888
+ var objectLiteral = mappedNode . kind === SyntaxKind . ObjectLiteral ? < ObjectLiteral > mappedNode : < ObjectLiteral > getAncestor ( mappedNode , SyntaxKind . ObjectLiteral ) ;
1861
1889
1862
- while ( node && node . kind ( ) !== TypeScript . SyntaxKind . ObjectLiteralExpression ) {
1863
- node = node . parent ;
1864
- }
1865
-
1866
- if ( ! node || node . kind ( ) !== TypeScript . SyntaxKind . ObjectLiteralExpression ) {
1867
- // AST Path look up did not result in the same node as Fidelity Syntax Tree look up.
1868
- // Once we remove AST this will no longer be a problem.
1869
- return null ;
1870
- }
1890
+ Debug . assert ( objectLiteral ) ;
1871
1891
1872
1892
isMemberCompletion = true ;
1873
1893
1874
- //// Try to get the object members form contextual typing
1875
- //var contextualMembers = compiler.getContextualMembersFromAST(node, document);
1876
- //if (contextualMembers && contextualMembers.symbols && contextualMembers.symbols.length > 0) {
1877
- // // get existing members
1878
- // var existingMembers = compiler.getVisibleMemberSymbolsFromAST(node, document);
1879
-
1880
- // // Add filtterd items to the completion list
1881
- // getCompletionEntriesFromSymbols({
1882
- // symbols: filterContextualMembersList(contextualMembers.symbols, existingMembers, filename, position),
1883
- // enclosingScopeSymbol: contextualMembers.enclosingScopeSymbol
1884
- // }, entries);
1885
- //}
1894
+ var contextualType = typeInfoResolver . getContextualType ( objectLiteral ) ;
1895
+ if ( ! contextualType ) {
1896
+ return undefined ;
1897
+ }
1898
+
1899
+ var contextualTypeMembers = typeInfoResolver . getPropertiesOfType ( contextualType ) ;
1900
+ if ( contextualTypeMembers && contextualTypeMembers . length > 0 ) {
1901
+ // Add filtterd items to the completion list
1902
+ var filteredMembers = filterContextualMembersList ( contextualTypeMembers , objectLiteral . properties ) ;
1903
+ getCompletionEntriesFromSymbols ( filteredMembers , activeCompletionSession ) ;
1904
+ }
1886
1905
}
1887
1906
// Get scope memebers
1888
1907
else {
0 commit comments