parent
148a060daa
commit
7a86a32040
@ -249,8 +249,8 @@ class TypeWrapper implements Symbol {
|
|||||||
if (symbol) {
|
if (symbol) {
|
||||||
return symbol.name;
|
return symbol.name;
|
||||||
} else {
|
} else {
|
||||||
// the js primitive type(e.g. 'string') doesn't have Symbol.
|
// A primitive type (e.g. 'string') doesn't have Symbol,
|
||||||
// use the ts.TypeChecker to get the type name.
|
// so use the ts.TypeChecker to get the type name.
|
||||||
return this.context.checker.typeToString(this.tsType);
|
return this.context.checker.typeToString(this.tsType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -314,7 +314,9 @@ class TypeWrapper implements Symbol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StringIndexTypeWrappr extends TypeWrapper {
|
// If stringIndexType a primitive type(e.g. 'string'), the Symbol is undefined;
|
||||||
|
// and in AstType.resolvePropertyRead method, the Symbol.type should get the right type.
|
||||||
|
class StringIndexTypeWrapper extends TypeWrapper {
|
||||||
public readonly type = new TypeWrapper(this.tsType, this.context);
|
public readonly type = new TypeWrapper(this.tsType, this.context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -516,11 +518,7 @@ class SymbolTableWrapper implements SymbolTable {
|
|||||||
// obj.stringIndex // equivalent to obj['stringIndex'];
|
// obj.stringIndex // equivalent to obj['stringIndex'];
|
||||||
//
|
//
|
||||||
// In this case, return the type indexed by an arbitrary string key.
|
// In this case, return the type indexed by an arbitrary string key.
|
||||||
|
return new StringIndexTypeWrapper(this.stringIndexType, this.context);
|
||||||
// if stringIndexType is js primitive type(e.g. 'string'), the Symbol is undefined;
|
|
||||||
// and In AstType.resolvePropertyRead method, the Symbol.type should get the right type.
|
|
||||||
// so I add a new Symbol type, 'StringIndexTypeWrappr'
|
|
||||||
return new StringIndexTypeWrappr(this.stringIndexType, this.context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
|
@ -146,6 +146,13 @@ describe('completions', () => {
|
|||||||
const completions = ngLS.getCompletionsAt(TEST_TEMPLATE, marker.start);
|
const completions = ngLS.getCompletionsAt(TEST_TEMPLATE, marker.start);
|
||||||
expectContain(completions, CompletionKind.PROPERTY, ['id', 'name']);
|
expectContain(completions, CompletionKind.PROPERTY, ['id', 'name']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should work with dot notation if stringIndexType is a primitive type', () => {
|
||||||
|
mockHost.override(TEST_TEMPLATE, `{{ primitiveIndexType.test.~{string-primitive-type}}}`);
|
||||||
|
const marker = mockHost.getLocationMarkerFor(TEST_TEMPLATE, 'string-primitive-type');
|
||||||
|
const completions = ngLS.getCompletionsAt(TEST_TEMPLATE, marker.start);
|
||||||
|
expectContain(completions, CompletionKind.METHOD, ['substring']);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -173,10 +173,9 @@ describe('diagnostics', () => {
|
|||||||
.toBe(`Identifier 'badProperty' is not defined. 'Hero' does not contain such a member`);
|
.toBe(`Identifier 'badProperty' is not defined. 'Hero' does not contain such a member`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not produce errors with dot notation if stringIndexType is js primitive type',
|
it('should not produce errors with dot notation if stringIndexType is a primitive type',
|
||||||
() => {
|
() => {
|
||||||
mockHost.override(TEST_TEMPLATE, `
|
mockHost.override(TEST_TEMPLATE, `{{primitiveIndexType.test}}`);
|
||||||
{{primitiveType.test}}`);
|
|
||||||
const diags = ngLS.getDiagnostics(TEST_TEMPLATE);
|
const diags = ngLS.getDiagnostics(TEST_TEMPLATE);
|
||||||
expect(diags.length).toBe(0);
|
expect(diags.length).toBe(0);
|
||||||
});
|
});
|
||||||
|
@ -192,7 +192,7 @@ export class TemplateReference {
|
|||||||
tupleArray: [string, Hero] = ['test', this.hero];
|
tupleArray: [string, Hero] = ['test', this.hero];
|
||||||
league: Hero[][] = [this.heroes];
|
league: Hero[][] = [this.heroes];
|
||||||
heroesByName: {[name: string]: Hero} = {};
|
heroesByName: {[name: string]: Hero} = {};
|
||||||
primitiveType: {[name: string]: string} = {};
|
primitiveIndexType: {[name: string]: string} = {};
|
||||||
anyValue: any;
|
anyValue: any;
|
||||||
myClick(event: any) {}
|
myClick(event: any) {}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user