diff --git a/src/resolver.ts b/src/resolver.ts index ca05a3424b..b1c2504521 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1440,8 +1440,10 @@ export class Resolver extends DiagnosticEmitter { case ElementKind.InterfacePrototype: case ElementKind.Class: case ElementKind.Interface: { + let classLikeTarget = target; + let findBase = false; do { - let member = target.getMember(propertyName); + let member = classLikeTarget.getMember(propertyName); if (member) { if (member.kind == ElementKind.PropertyPrototype) { let propertyInstance = this.resolveProperty(member, reportMode); @@ -1458,34 +1460,32 @@ export class Resolver extends DiagnosticEmitter { this.currentElementExpression = null; return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE, PROPERTY... } - // traverse inherited static members on the base prototype if target is a class prototype - if ( - target.kind == ElementKind.ClassPrototype || - target.kind == ElementKind.InterfacePrototype - ) { - let classPrototype = target; - let basePrototype = classPrototype.basePrototype; - if (basePrototype) { - target = basePrototype; - } else { + findBase = false; + switch (classLikeTarget.kind) { + case ElementKind.ClassPrototype: + case ElementKind.InterfacePrototype: { + // traverse inherited static members on the base prototype if target is a class prototype + let classPrototype = classLikeTarget; + let basePrototype = classPrototype.basePrototype; + if (basePrototype) { + findBase = true; + classLikeTarget = basePrototype; + } break; } - // traverse inherited instance members on the base class if target is a class instance - } else if ( - target.kind == ElementKind.Class || - target.kind == ElementKind.Interface - ) { - let classInstance = target; - let baseInstance = classInstance.base; - if (baseInstance) { - target = baseInstance; - } else { + case ElementKind.Class: + case ElementKind.Interface: { + // traverse inherited instance members on the base class if target is a class instance + let classInstance = classLikeTarget; + let baseInstance = classInstance.base; + if (baseInstance) { + findBase = true; + classLikeTarget = baseInstance; + } break; } - } else { - break; } - } while (true); + } while (findBase); break; } default: { // enums or other namespace-like elements diff --git a/tests/compiler/class-errors.json b/tests/compiler/class-errors.json new file mode 100644 index 0000000000..d852107478 --- /dev/null +++ b/tests/compiler/class-errors.json @@ -0,0 +1,9 @@ +{ + "asc_flags": [ + ], + "stderr": [ + "TS2304: Cannot find name 'T'.", + "TS2339: Property 'v' does not exist on type 'class-errors/A'.", + "EOF" + ] +} diff --git a/tests/compiler/class-errors.ts b/tests/compiler/class-errors.ts new file mode 100644 index 0000000000..ff71b03088 --- /dev/null +++ b/tests/compiler/class-errors.ts @@ -0,0 +1,7 @@ +class A { + v: T; +} + +new A().v; + +ERROR("EOF");