mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Constructor functions as classes (#32944)
* Initial implementation The original test passes but I haven't run any other tests yet, so I assume the world is now broken. * Append constructor function construct sigs Instead of overwriting them * Grab bag of improvements. 1. Mark @class-tagged functions with Class too. 2. Only gather local type parameters of constructor functions. 3. Remove getJSClassType calls with getDeclaredTypeOfSymbol. 4. Add a couple more failing tests. getDeclaredTypeOfClassOrInterface now needs to understand prototype assignment. That's next, I think. * Prototype assignments work now 1. Binder marks prototype assignments as Class now. 2. Checker merges prototype assignments using the same merge code as for functions and their declarations. No more intersections. Many fewer failing tests now. * Mark prototype-property assignments as Class Even if there are no this-property assignments in them. (Then why are you using a class?). * Simplify getJSClassType, remove calls to its guts It's probably not needed because now it's just a conditional call to getDeclaredTypeOfSymbol, and I think most callers already know whether they have a JS constructor function beforehand. * isJSDocConstructor doesn't need to check prototype anymore Because all the properties are merged during getDeclaredTypeOfSymbol. * outer type parameter lookup follow prototype assignment * this-type and -expression support in ctor funcs Pretty cool! * Fix remaining tests * Fix minor lint * Delete now-unused code * Add class flag to nested class declarations Also remove old TODOs
This commit is contained in:
+25
-9
@@ -227,7 +227,7 @@ namespace ts {
|
||||
symbol.flags |= symbolFlags;
|
||||
|
||||
node.symbol = symbol;
|
||||
symbol.declarations = append(symbol.declarations, node);
|
||||
symbol.declarations = appendIfUnique(symbol.declarations, node);
|
||||
|
||||
if (symbolFlags & (SymbolFlags.Class | SymbolFlags.Enum | SymbolFlags.Module | SymbolFlags.Variable) && !symbol.exports) {
|
||||
symbol.exports = createSymbolTable();
|
||||
@@ -737,6 +737,9 @@ namespace ts {
|
||||
case SyntaxKind.JSDocEnumTag:
|
||||
bindJSDocTypeAlias(node as JSDocTypedefTag | JSDocCallbackTag | JSDocEnumTag);
|
||||
break;
|
||||
case SyntaxKind.JSDocClassTag:
|
||||
bindJSDocClassTag(node as JSDocClassTag);
|
||||
break;
|
||||
// In source files and blocks, bind functions first to match hoisting that occurs at runtime
|
||||
case SyntaxKind.SourceFile: {
|
||||
bindEachFunctionsFirst((node as SourceFile).statements);
|
||||
@@ -1446,6 +1449,14 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
function bindJSDocClassTag(node: JSDocClassTag) {
|
||||
bindEachChild(node);
|
||||
const host = getHostSignatureFromJSDoc(node);
|
||||
if (host && host.kind !== SyntaxKind.MethodDeclaration) {
|
||||
addDeclarationToSymbol(host.symbol, host, SymbolFlags.Class);
|
||||
}
|
||||
}
|
||||
|
||||
function bindCallExpressionFlow(node: CallExpression) {
|
||||
// If the target of the call expression is a function expression or arrow function we have
|
||||
// an immediately invoked function expression (IIFE). Initialize the flowNode property to
|
||||
@@ -1813,7 +1824,8 @@ namespace ts {
|
||||
// typedef anchored to an A.B.C assignment - we need to bind into B's namespace under name C
|
||||
const isTopLevel = isTopLevelNamespaceAssignment(declName.parent);
|
||||
if (isTopLevel) {
|
||||
bindPotentiallyMissingNamespaces(file.symbol, declName.parent, isTopLevel, !!findAncestor(declName, d => isPropertyAccessExpression(d) && d.name.escapedText === "prototype"));
|
||||
bindPotentiallyMissingNamespaces(file.symbol, declName.parent, isTopLevel,
|
||||
!!findAncestor(declName, d => isPropertyAccessExpression(d) && d.name.escapedText === "prototype"), /*containerIsClass*/ false);
|
||||
const oldContainer = container;
|
||||
container = isPropertyAccessExpression(declName.parent.expression) ? declName.parent.expression.name : declName.parent.expression;
|
||||
declareModuleMember(typeAlias, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes);
|
||||
@@ -2510,6 +2522,7 @@ namespace ts {
|
||||
constructorSymbol.members = constructorSymbol.members || createSymbolTable();
|
||||
// It's acceptable for multiple 'this' assignments of the same identifier to occur
|
||||
declareSymbol(constructorSymbol.members, constructorSymbol, node, SymbolFlags.Property, SymbolFlags.PropertyExcludes & ~SymbolFlags.Property);
|
||||
addDeclarationToSymbol(constructorSymbol, constructorSymbol.valueDeclaration, SymbolFlags.Class);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2558,7 +2571,7 @@ namespace ts {
|
||||
node.left.parent = node;
|
||||
node.right.parent = node;
|
||||
const lhs = node.left as PropertyAccessEntityNameExpression;
|
||||
bindPropertyAssignment(lhs.expression, lhs, /*isPrototypeProperty*/ false);
|
||||
bindPropertyAssignment(lhs.expression, lhs, /*isPrototypeProperty*/ false, /*containerIsClass*/ true);
|
||||
}
|
||||
|
||||
function bindObjectDefinePrototypeProperty(node: BindableObjectDefinePropertyCall) {
|
||||
@@ -2581,13 +2594,13 @@ namespace ts {
|
||||
constructorFunction.parent = classPrototype;
|
||||
classPrototype.parent = lhs;
|
||||
|
||||
bindPropertyAssignment(constructorFunction, lhs, /*isPrototypeProperty*/ true);
|
||||
bindPropertyAssignment(constructorFunction, lhs, /*isPrototypeProperty*/ true, /*containerIsClass*/ true);
|
||||
}
|
||||
|
||||
function bindObjectDefinePropertyAssignment(node: BindableObjectDefinePropertyCall) {
|
||||
let namespaceSymbol = lookupSymbolForPropertyAccess(node.arguments[0]);
|
||||
const isToplevel = node.parent.parent.kind === SyntaxKind.SourceFile;
|
||||
namespaceSymbol = bindPotentiallyMissingNamespaces(namespaceSymbol, node.arguments[0], isToplevel, /*isPrototypeProperty*/ false);
|
||||
namespaceSymbol = bindPotentiallyMissingNamespaces(namespaceSymbol, node.arguments[0], isToplevel, /*isPrototypeProperty*/ false, /*containerIsClass*/ false);
|
||||
bindPotentiallyNewExpandoMemberToNamespace(node, namespaceSymbol, /*isPrototypeProperty*/ false);
|
||||
}
|
||||
|
||||
@@ -2618,10 +2631,10 @@ namespace ts {
|
||||
*/
|
||||
function bindStaticPropertyAssignment(node: PropertyAccessEntityNameExpression) {
|
||||
node.expression.parent = node;
|
||||
bindPropertyAssignment(node.expression, node, /*isPrototypeProperty*/ false);
|
||||
bindPropertyAssignment(node.expression, node, /*isPrototypeProperty*/ false, /*containerIsClass*/ false);
|
||||
}
|
||||
|
||||
function bindPotentiallyMissingNamespaces(namespaceSymbol: Symbol | undefined, entityName: EntityNameExpression, isToplevel: boolean, isPrototypeProperty: boolean) {
|
||||
function bindPotentiallyMissingNamespaces(namespaceSymbol: Symbol | undefined, entityName: EntityNameExpression, isToplevel: boolean, isPrototypeProperty: boolean, containerIsClass: boolean) {
|
||||
if (isToplevel && !isPrototypeProperty) {
|
||||
// make symbols or add declarations for intermediate containers
|
||||
const flags = SymbolFlags.Module | SymbolFlags.Assignment;
|
||||
@@ -2638,6 +2651,9 @@ namespace ts {
|
||||
}
|
||||
});
|
||||
}
|
||||
if (containerIsClass && namespaceSymbol) {
|
||||
addDeclarationToSymbol(namespaceSymbol, namespaceSymbol.valueDeclaration, SymbolFlags.Class);
|
||||
}
|
||||
return namespaceSymbol;
|
||||
}
|
||||
|
||||
@@ -2663,10 +2679,10 @@ namespace ts {
|
||||
: propertyAccess.parent.parent.kind === SyntaxKind.SourceFile;
|
||||
}
|
||||
|
||||
function bindPropertyAssignment(name: EntityNameExpression, propertyAccess: PropertyAccessEntityNameExpression, isPrototypeProperty: boolean) {
|
||||
function bindPropertyAssignment(name: EntityNameExpression, propertyAccess: PropertyAccessEntityNameExpression, isPrototypeProperty: boolean, containerIsClass: boolean) {
|
||||
let namespaceSymbol = lookupSymbolForPropertyAccess(name);
|
||||
const isToplevel = isTopLevelNamespaceAssignment(propertyAccess);
|
||||
namespaceSymbol = bindPotentiallyMissingNamespaces(namespaceSymbol, propertyAccess.expression, isToplevel, isPrototypeProperty);
|
||||
namespaceSymbol = bindPotentiallyMissingNamespaces(namespaceSymbol, propertyAccess.expression, isToplevel, isPrototypeProperty, containerIsClass);
|
||||
bindPotentiallyNewExpandoMemberToNamespace(propertyAccess, namespaceSymbol, isPrototypeProperty);
|
||||
}
|
||||
|
||||
|
||||
+86
-73
@@ -2041,12 +2041,16 @@ namespace ts {
|
||||
|
||||
function checkResolvedBlockScopedVariable(result: Symbol, errorLocation: Node): void {
|
||||
Debug.assert(!!(result.flags & SymbolFlags.BlockScopedVariable || result.flags & SymbolFlags.Class || result.flags & SymbolFlags.Enum));
|
||||
if (result.flags & (SymbolFlags.Function | SymbolFlags.FunctionScopedVariable | SymbolFlags.Assignment) && result.flags & SymbolFlags.Class) {
|
||||
// constructor functions aren't block scoped
|
||||
return;
|
||||
}
|
||||
// Block-scoped variables cannot be used before their definition
|
||||
const declaration = find(
|
||||
result.declarations,
|
||||
d => isBlockOrCatchScoped(d) || isClassLike(d) || (d.kind === SyntaxKind.EnumDeclaration));
|
||||
|
||||
if (declaration === undefined) return Debug.fail("Declaration to checkResolvedBlockScopedVariable is undefined");
|
||||
if (declaration === undefined) return Debug.fail("checkResolvedBlockScopedVariable could not find block-scoped declaration");
|
||||
|
||||
if (!(declaration.flags & NodeFlags.Ambient) && !isBlockScopedNameDeclaredBeforeUse(declaration, errorLocation)) {
|
||||
let diagnosticMessage;
|
||||
@@ -3811,7 +3815,7 @@ namespace ts {
|
||||
id = (isConstructorObject ? "+" : "") + getSymbolId(symbol);
|
||||
if (isJSConstructor(symbol.valueDeclaration)) {
|
||||
// Instance and static types share the same symbol; only add 'typeof' for the static side.
|
||||
const isInstanceType = type === getInferredClassType(symbol) ? SymbolFlags.Type : SymbolFlags.Value;
|
||||
const isInstanceType = type === getDeclaredTypeOfClassOrInterface(symbol) ? SymbolFlags.Type : SymbolFlags.Value;
|
||||
return symbolToTypeNode(symbol, context, isInstanceType);
|
||||
}
|
||||
// Always use 'typeof T' for type of class, enum, and module objects
|
||||
@@ -5974,19 +5978,10 @@ namespace ts {
|
||||
if (!links.type) {
|
||||
const jsDeclaration = getDeclarationOfExpando(symbol.valueDeclaration);
|
||||
if (jsDeclaration) {
|
||||
const jsSymbol = getSymbolOfNode(jsDeclaration);
|
||||
if (jsSymbol && (hasEntries(jsSymbol.exports) || hasEntries(jsSymbol.members))) {
|
||||
symbol = cloneSymbol(symbol);
|
||||
const merged = mergeJSSymbols(symbol, getSymbolOfNode(jsDeclaration));
|
||||
if (merged) {
|
||||
// note:we overwrite links because we just cloned the symbol
|
||||
links = symbol as TransientSymbol;
|
||||
if (hasEntries(jsSymbol.exports)) {
|
||||
symbol.exports = symbol.exports || createSymbolTable();
|
||||
mergeSymbolTable(symbol.exports, jsSymbol.exports);
|
||||
}
|
||||
if (hasEntries(jsSymbol.members)) {
|
||||
symbol.members = symbol.members || createSymbolTable();
|
||||
mergeSymbolTable(symbol.members, jsSymbol.members);
|
||||
}
|
||||
symbol = links = merged;
|
||||
}
|
||||
}
|
||||
originalLinks.type = links.type = getTypeOfFuncClassEnumModuleWorker(symbol);
|
||||
@@ -6161,6 +6156,16 @@ namespace ts {
|
||||
function getOuterTypeParameters(node: Node, includeThisTypes?: boolean): TypeParameter[] | undefined {
|
||||
while (true) {
|
||||
node = node.parent; // TODO: GH#18217 Use SourceFile kind check instead
|
||||
if (node && isBinaryExpression(node)) {
|
||||
// prototype assignments get the outer type parameters of their constructor function
|
||||
const assignmentKind = getAssignmentDeclarationKind(node);
|
||||
if (assignmentKind === AssignmentDeclarationKind.Prototype || assignmentKind === AssignmentDeclarationKind.PrototypeProperty) {
|
||||
const symbol = getSymbolOfNode(node.left);
|
||||
if (symbol && symbol.parent && !findAncestor(symbol.parent.valueDeclaration, d => node === d)) {
|
||||
node = symbol.parent.valueDeclaration;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!node) {
|
||||
return undefined;
|
||||
}
|
||||
@@ -6194,7 +6199,7 @@ namespace ts {
|
||||
}
|
||||
const outerAndOwnTypeParameters = appendTypeParameters(outerTypeParameters, getEffectiveTypeParameterDeclarations(<DeclarationWithTypeParameters>node));
|
||||
const thisType = includeThisTypes &&
|
||||
(node.kind === SyntaxKind.ClassDeclaration || node.kind === SyntaxKind.ClassExpression || node.kind === SyntaxKind.InterfaceDeclaration) &&
|
||||
(node.kind === SyntaxKind.ClassDeclaration || node.kind === SyntaxKind.ClassExpression || node.kind === SyntaxKind.InterfaceDeclaration || isJSConstructor(node)) &&
|
||||
getDeclaredTypeOfClassOrInterface(getSymbolOfNode(node as ClassLikeDeclaration | InterfaceDeclaration)).thisType;
|
||||
return thisType ? append(outerAndOwnTypeParameters, thisType) : outerAndOwnTypeParameters;
|
||||
}
|
||||
@@ -6215,6 +6220,7 @@ namespace ts {
|
||||
if (node.kind === SyntaxKind.InterfaceDeclaration ||
|
||||
node.kind === SyntaxKind.ClassDeclaration ||
|
||||
node.kind === SyntaxKind.ClassExpression ||
|
||||
isJSConstructor(node) ||
|
||||
isTypeAlias(node)) {
|
||||
const declaration = <InterfaceDeclaration | TypeAliasDeclaration | JSDocTypedefTag | JSDocCallbackTag>node;
|
||||
result = appendTypeParameters(result, getEffectiveTypeParameterDeclarations(declaration));
|
||||
@@ -6248,7 +6254,7 @@ namespace ts {
|
||||
const constraint = getBaseConstraintOfType(type);
|
||||
return !!constraint && isValidBaseType(constraint) && isMixinConstructorType(constraint);
|
||||
}
|
||||
return isJSConstructorType(type);
|
||||
return false;
|
||||
}
|
||||
|
||||
function getBaseTypeNodeOfClass(type: InterfaceType): ExpressionWithTypeArguments | undefined {
|
||||
@@ -6350,9 +6356,7 @@ namespace ts {
|
||||
const baseTypeNode = getBaseTypeNodeOfClass(type)!;
|
||||
const typeArgs = typeArgumentsFromTypeReferenceNode(baseTypeNode);
|
||||
let baseType: Type;
|
||||
const originalBaseType = isJSConstructorType(baseConstructorType) ? baseConstructorType :
|
||||
baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) :
|
||||
undefined;
|
||||
const originalBaseType = baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) : undefined;
|
||||
if (baseConstructorType.symbol && baseConstructorType.symbol.flags & SymbolFlags.Class &&
|
||||
areAllOuterTypeParametersApplied(originalBaseType!)) {
|
||||
// When base constructor type is a class with no captured type arguments we know that the constructors all have the same type parameters as the
|
||||
@@ -6363,9 +6367,6 @@ namespace ts {
|
||||
else if (baseConstructorType.flags & TypeFlags.Any) {
|
||||
baseType = baseConstructorType;
|
||||
}
|
||||
else if (isJSConstructorType(baseConstructorType)) {
|
||||
baseType = !baseTypeNode.typeArguments && getJSClassType(baseConstructorType.symbol) || anyType;
|
||||
}
|
||||
else {
|
||||
// The class derives from a "class-like" constructor function, check that we have at least one construct signature
|
||||
// with a matching number of type parameters and use the return type of the first instantiated signature. Elsewhere
|
||||
@@ -6478,10 +6479,17 @@ namespace ts {
|
||||
}
|
||||
|
||||
function getDeclaredTypeOfClassOrInterface(symbol: Symbol): InterfaceType {
|
||||
const links = getSymbolLinks(symbol);
|
||||
let links = getSymbolLinks(symbol);
|
||||
const originalLinks = links;
|
||||
if (!links.declaredType) {
|
||||
const kind = symbol.flags & SymbolFlags.Class ? ObjectFlags.Class : ObjectFlags.Interface;
|
||||
const type = links.declaredType = <InterfaceType>createObjectType(kind, symbol);
|
||||
const merged = mergeJSSymbols(symbol, getAssignedClassSymbol(symbol.valueDeclaration));
|
||||
if (merged) {
|
||||
// note:we overwrite links because we just cloned the symbol
|
||||
symbol = links = merged;
|
||||
}
|
||||
|
||||
const type = originalLinks.declaredType = links.declaredType = <InterfaceType>createObjectType(kind, symbol);
|
||||
const outerTypeParameters = getOuterTypeParametersOfClassOrInterface(symbol);
|
||||
const localTypeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
|
||||
// A class or interface is generic if it has type parameters or a "this" type. We always give classes a "this" type
|
||||
@@ -7452,7 +7460,7 @@ namespace ts {
|
||||
* Converts an AnonymousType to a ResolvedType.
|
||||
*/
|
||||
function resolveAnonymousTypeMembers(type: AnonymousType) {
|
||||
const symbol = type.symbol;
|
||||
const symbol = getMergedSymbol(type.symbol);
|
||||
if (type.target) {
|
||||
setStructuredTypeMembers(type, emptySymbols, emptyArray, emptyArray, undefined, undefined);
|
||||
const members = createInstantiatedSymbolTable(getPropertiesOfObjectType(type.target), type.mapper!, /*mappingThisOnly*/ false);
|
||||
@@ -7508,12 +7516,18 @@ namespace ts {
|
||||
// will never be observed because a qualified name can't reference signatures.
|
||||
if (symbol.flags & (SymbolFlags.Function | SymbolFlags.Method)) {
|
||||
type.callSignatures = getSignaturesOfSymbol(symbol);
|
||||
type.constructSignatures = filter(type.callSignatures, sig => isJSConstructor(sig.declaration));
|
||||
}
|
||||
// And likewise for construct signatures for classes
|
||||
if (symbol.flags & SymbolFlags.Class) {
|
||||
const classType = getDeclaredTypeOfClassOrInterface(symbol);
|
||||
let constructSignatures = getSignaturesOfSymbol(symbol.members!.get(InternalSymbolName.Constructor));
|
||||
let constructSignatures = symbol.members ? getSignaturesOfSymbol(symbol.members.get(InternalSymbolName.Constructor)) : emptyArray;
|
||||
if (symbol.flags & SymbolFlags.Function) {
|
||||
constructSignatures = addRange(constructSignatures.slice(), mapDefined(
|
||||
type.callSignatures,
|
||||
sig => isJSConstructor(sig.declaration) ?
|
||||
createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, classType, /*resolvedTypePredicate*/ undefined, sig.minArgumentCount, sig.hasRestParameter, sig.hasLiteralTypes) :
|
||||
undefined));
|
||||
}
|
||||
if (!constructSignatures.length) {
|
||||
constructSignatures = getDefaultConstructSignatures(classType);
|
||||
}
|
||||
@@ -8748,7 +8762,6 @@ namespace ts {
|
||||
let type = signature.target ? instantiateType(getReturnTypeOfSignature(signature.target), signature.mapper!) :
|
||||
signature.unionSignatures ? getUnionType(map(signature.unionSignatures, getReturnTypeOfSignature), UnionReduction.Subtype) :
|
||||
getReturnTypeFromAnnotation(signature.declaration!) ||
|
||||
isJSConstructor(signature.declaration) && getJSClassType(getSymbolOfNode(signature.declaration!)) ||
|
||||
(nodeIsMissing((<FunctionLikeDeclaration>signature.declaration).body) ? anyType : getReturnTypeFromBody(<FunctionLikeDeclaration>signature.declaration));
|
||||
if (!popTypeResolution()) {
|
||||
if (signature.declaration) {
|
||||
@@ -11096,10 +11109,25 @@ namespace ts {
|
||||
const parent = container && container.parent;
|
||||
if (parent && (isClassLike(parent) || parent.kind === SyntaxKind.InterfaceDeclaration)) {
|
||||
if (!hasModifier(container, ModifierFlags.Static) &&
|
||||
(container.kind !== SyntaxKind.Constructor || isNodeDescendantOf(node, (<ConstructorDeclaration>container).body!))) {
|
||||
(!isConstructorDeclaration(container) || isNodeDescendantOf(node, container.body))) {
|
||||
return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(parent as ClassLikeDeclaration | InterfaceDeclaration)).thisType!;
|
||||
}
|
||||
}
|
||||
|
||||
// inside x.prototype = { ... }
|
||||
if (parent && isObjectLiteralExpression(parent) && isBinaryExpression(parent.parent) && getAssignmentDeclarationKind(parent.parent) === AssignmentDeclarationKind.Prototype) {
|
||||
return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(parent.parent.left)!.parent!).thisType!;
|
||||
}
|
||||
// /** @return {this} */
|
||||
// x.prototype.m = function() { ... }
|
||||
const host = node.flags & NodeFlags.JSDoc ? getHostSignatureFromJSDoc(node) : undefined;
|
||||
if (host && isFunctionExpression(host) && isBinaryExpression(host.parent) && getAssignmentDeclarationKind(host.parent) === AssignmentDeclarationKind.PrototypeProperty) {
|
||||
return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(host.parent.left)!.parent!).thisType!;
|
||||
}
|
||||
// inside constructor function C() { ... }
|
||||
if (isJSConstructor(container) && isNodeDescendantOf(node, container.body)) {
|
||||
return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(container)).thisType!;
|
||||
}
|
||||
error(node, Diagnostics.A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface);
|
||||
return errorType;
|
||||
}
|
||||
@@ -12391,15 +12419,17 @@ namespace ts {
|
||||
}
|
||||
|
||||
if (!ignoreReturnTypes) {
|
||||
// If a signature reolution is already in-flight, skip issuing a circularity error
|
||||
// If a signature resolution is already in-flight, skip issuing a circularity error
|
||||
// here and just use the `any` type directly
|
||||
const targetReturnType = isResolvingReturnTypeOfSignature(target) ? anyType : (target.declaration && isJSConstructor(target.declaration)) ?
|
||||
getJSClassType(target.declaration.symbol)! : getReturnTypeOfSignature(target);
|
||||
const targetReturnType = isResolvingReturnTypeOfSignature(target) ? anyType
|
||||
: target.declaration && isJSConstructor(target.declaration) ? getDeclaredTypeOfClassOrInterface(target.declaration.symbol)
|
||||
: getReturnTypeOfSignature(target);
|
||||
if (targetReturnType === voidType) {
|
||||
return result;
|
||||
}
|
||||
const sourceReturnType = isResolvingReturnTypeOfSignature(source) ? anyType : (source.declaration && isJSConstructor(source.declaration)) ?
|
||||
getJSClassType(source.declaration.symbol)! : getReturnTypeOfSignature(source);
|
||||
const sourceReturnType = isResolvingReturnTypeOfSignature(source) ? anyType
|
||||
: source.declaration && isJSConstructor(source.declaration) ? getDeclaredTypeOfClassOrInterface(source.declaration.symbol)
|
||||
: getReturnTypeOfSignature(source);
|
||||
|
||||
// The following block preserves behavior forbidding boolean returning functions from being assignable to type guard returning functions
|
||||
const targetTypePredicate = getTypePredicateOfSignature(target);
|
||||
@@ -18289,10 +18319,8 @@ namespace ts {
|
||||
if (isInJS && className) {
|
||||
const classSymbol = checkExpression(className).symbol;
|
||||
if (classSymbol && classSymbol.members && (classSymbol.flags & SymbolFlags.Function)) {
|
||||
const classType = getJSClassType(classSymbol);
|
||||
if (classType) {
|
||||
return getFlowTypeOfReference(node, classType);
|
||||
}
|
||||
const classType = (getDeclaredTypeOfSymbol(classSymbol) as InterfaceType).thisType!;
|
||||
return getFlowTypeOfReference(node, classType);
|
||||
}
|
||||
}
|
||||
// Check if it's a constructor definition, can be either a variable decl or function decl
|
||||
@@ -18302,10 +18330,8 @@ namespace ts {
|
||||
else if (isInJS &&
|
||||
(container.kind === SyntaxKind.FunctionExpression || container.kind === SyntaxKind.FunctionDeclaration) &&
|
||||
getJSDocClassTag(container)) {
|
||||
const classType = getJSClassType(getMergedSymbol(container.symbol));
|
||||
if (classType) {
|
||||
return getFlowTypeOfReference(node, classType);
|
||||
}
|
||||
const classType = (getDeclaredTypeOfSymbol(getMergedSymbol(container.symbol)) as InterfaceType).thisType!;
|
||||
return getFlowTypeOfReference(node, classType);
|
||||
}
|
||||
|
||||
const thisType = getThisTypeOfDeclaration(container) || getContextualThisParameterType(container);
|
||||
@@ -18316,7 +18342,7 @@ namespace ts {
|
||||
|
||||
if (isClassLike(container.parent)) {
|
||||
const symbol = getSymbolOfNode(container.parent);
|
||||
const type = hasModifier(container, ModifierFlags.Static) ? getTypeOfSymbol(symbol) : (<InterfaceType>getDeclaredTypeOfSymbol(symbol)).thisType!;
|
||||
const type = hasModifier(container, ModifierFlags.Static) ? getTypeOfSymbol(symbol) : (getDeclaredTypeOfSymbol(symbol) as InterfaceType).thisType!;
|
||||
return getFlowTypeOfReference(node, type);
|
||||
}
|
||||
|
||||
@@ -22836,7 +22862,7 @@ namespace ts {
|
||||
* Indicates whether a declaration can be treated as a constructor in a JavaScript
|
||||
* file.
|
||||
*/
|
||||
function isJSConstructor(node: Declaration | undefined): boolean {
|
||||
function isJSConstructor(node: Node | undefined): node is FunctionDeclaration | FunctionExpression {
|
||||
if (!node || !isInJSFile(node)) {
|
||||
return false;
|
||||
}
|
||||
@@ -22849,39 +22875,35 @@ namespace ts {
|
||||
|
||||
// If the symbol of the node has members, treat it like a constructor.
|
||||
const symbol = getSymbolOfNode(func);
|
||||
return !!symbol && (symbol.members !== undefined || symbol.exports !== undefined && symbol.exports.get("prototype" as __String) !== undefined);
|
||||
return !!symbol && symbol.members !== undefined;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function isJSConstructorType(type: Type) {
|
||||
if (type.flags & TypeFlags.Object) {
|
||||
const resolved = resolveStructuredTypeMembers(<ObjectType>type);
|
||||
return resolved.callSignatures.length === 1 && isJSConstructor(resolved.callSignatures[0].declaration);
|
||||
function mergeJSSymbols(target: Symbol, source: Symbol | undefined) {
|
||||
if (source && (hasEntries(source.exports) || hasEntries(source.members))) {
|
||||
target = cloneSymbol(target);
|
||||
if (hasEntries(source.exports)) {
|
||||
target.exports = target.exports || createSymbolTable();
|
||||
mergeSymbolTable(target.exports, source.exports);
|
||||
}
|
||||
if (hasEntries(source.members)) {
|
||||
target.members = target.members || createSymbolTable();
|
||||
mergeSymbolTable(target.members, source.members);
|
||||
}
|
||||
target.flags |= source.flags & SymbolFlags.Class;
|
||||
return target as TransientSymbol;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getJSClassType(symbol: Symbol): Type | undefined {
|
||||
let inferred: Type | undefined;
|
||||
if (isJSConstructor(symbol.valueDeclaration)) {
|
||||
inferred = getInferredClassType(symbol);
|
||||
}
|
||||
const assigned = getAssignedClassType(symbol);
|
||||
return assigned && inferred ?
|
||||
getIntersectionType([inferred, assigned]) :
|
||||
assigned || inferred;
|
||||
}
|
||||
|
||||
function getAssignedClassType(symbol: Symbol): Type | undefined {
|
||||
const decl = symbol.valueDeclaration;
|
||||
function getAssignedClassSymbol(decl: Declaration): Symbol | undefined {
|
||||
const assignmentSymbol = decl && decl.parent &&
|
||||
(isFunctionDeclaration(decl) && getSymbolOfNode(decl) ||
|
||||
isBinaryExpression(decl.parent) && getSymbolOfNode(decl.parent.left) ||
|
||||
isVariableDeclaration(decl.parent) && getSymbolOfNode(decl.parent));
|
||||
const prototype = assignmentSymbol && assignmentSymbol.exports && assignmentSymbol.exports.get("prototype" as __String);
|
||||
const init = prototype && prototype.valueDeclaration && getAssignedJSPrototype(prototype.valueDeclaration);
|
||||
return init ? getWidenedType(checkExpressionCached(init)) : undefined;
|
||||
return init ? getSymbolOfNode(init) : undefined;
|
||||
}
|
||||
|
||||
function getAssignedJSPrototype(node: Node) {
|
||||
@@ -22898,15 +22920,6 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getInferredClassType(symbol: Symbol) {
|
||||
const links = getSymbolLinks(symbol);
|
||||
if (!links.inferredClassType) {
|
||||
links.inferredClassType = createAnonymousType(symbol, getMembersOfSymbol(symbol) || emptySymbols, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined);
|
||||
}
|
||||
return links.inferredClassType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Syntactically and semantically checks a call or new expression.
|
||||
* @param node The call/new expression to be checked.
|
||||
|
||||
@@ -3778,7 +3778,6 @@ namespace ts {
|
||||
resolvedJSDocType?: Type; // Resolved type of a JSDoc type reference
|
||||
typeParameters?: TypeParameter[]; // Type parameters of type alias (undefined if non-generic)
|
||||
outerTypeParameters?: TypeParameter[]; // Outer type parameters of anonymous object type
|
||||
inferredClassType?: Type; // Type of an inferred ES5 class
|
||||
instantiations?: Map<Type>; // Instantiations of generic type alias (undefined if non-generic)
|
||||
mapper?: TypeMapper; // Type mapper for instantiation alias
|
||||
referenced?: boolean; // True if alias symbol has been referenced as a value
|
||||
|
||||
@@ -2507,7 +2507,7 @@ namespace ts {
|
||||
return node && node.kind === SyntaxKind.DeleteExpression;
|
||||
}
|
||||
|
||||
export function isNodeDescendantOf(node: Node, ancestor: Node): boolean {
|
||||
export function isNodeDescendantOf(node: Node, ancestor: Node | undefined): boolean {
|
||||
while (node) {
|
||||
if (node === ancestor) return true;
|
||||
node = node.parent;
|
||||
|
||||
@@ -7,15 +7,15 @@ var mod = require('./mod');
|
||||
>'./mod' : "./mod"
|
||||
|
||||
var a = new mod.A()
|
||||
>a : A & { m(n: number): number; }
|
||||
>new mod.A() : A & { m(n: number): number; }
|
||||
>a : A
|
||||
>new mod.A() : A
|
||||
>mod.A : typeof A
|
||||
>mod : typeof import("tests/cases/conformance/salsa/mod")
|
||||
>A : typeof A
|
||||
|
||||
var b = new mod.B()
|
||||
>b : B & { m(n: number): number; }
|
||||
>new mod.B() : B & { m(n: number): number; }
|
||||
>b : B
|
||||
>new mod.B() : B
|
||||
>mod.B : typeof B
|
||||
>mod : typeof import("tests/cases/conformance/salsa/mod")
|
||||
>B : typeof B
|
||||
@@ -23,14 +23,14 @@ var b = new mod.B()
|
||||
a.m('nope')
|
||||
>a.m('nope') : number
|
||||
>a.m : (n: number) => number
|
||||
>a : A & { m(n: number): number; }
|
||||
>a : A
|
||||
>m : (n: number) => number
|
||||
>'nope' : "nope"
|
||||
|
||||
b.m('not really')
|
||||
>b.m('not really') : number
|
||||
>b.m : (n: number) => number
|
||||
>b : B & { m(n: number): number; }
|
||||
>b : B
|
||||
>m : (n: number) => number
|
||||
>'not really' : "not really"
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ function Person(name) {
|
||||
this.name = name;
|
||||
>this.name = name : string
|
||||
>this.name : string
|
||||
>this : Person
|
||||
>this : this
|
||||
>name : string
|
||||
>name : string
|
||||
}
|
||||
@@ -123,7 +123,7 @@ Person.prototype.describe = function () {
|
||||
>"Person called " + this.name : string
|
||||
>"Person called " : "Person called "
|
||||
>this.name : string
|
||||
>this : Person
|
||||
>this : this
|
||||
>name : string
|
||||
|
||||
};
|
||||
@@ -204,7 +204,7 @@ Object.defineProperty(Person.prototype, "setonlyAccessor", {
|
||||
this.rwAccessors = Number(str)
|
||||
>this.rwAccessors = Number(str) : number
|
||||
>this.rwAccessors : number
|
||||
>this : Person
|
||||
>this : this
|
||||
>rwAccessors : number
|
||||
>Number(str) : number
|
||||
>Number : NumberConstructor
|
||||
|
||||
@@ -205,7 +205,9 @@ class Chowder extends Soup {
|
||||
>log : Symbol(Chowder.log, Decl(generic.js, 8, 28))
|
||||
|
||||
return this.flavour
|
||||
>this.flavour : Symbol(Soup.flavour, Decl(generic.js, 4, 24))
|
||||
>this : Symbol(Chowder, Decl(generic.js, 6, 1))
|
||||
>flavour : Symbol(Soup.flavour, Decl(generic.js, 4, 24))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,7 +226,11 @@ var chowder = new Chowder({ claim: "ignorant" });
|
||||
>claim : Symbol(claim, Decl(generic.js, 16, 27))
|
||||
|
||||
chowder.flavour.claim
|
||||
>chowder.flavour.claim : Symbol(claim, Decl(generic.js, 7, 20))
|
||||
>chowder.flavour : Symbol(Soup.flavour, Decl(generic.js, 4, 24))
|
||||
>chowder : Symbol(chowder, Decl(generic.js, 16, 3))
|
||||
>flavour : Symbol(Soup.flavour, Decl(generic.js, 4, 24))
|
||||
>claim : Symbol(claim, Decl(generic.js, 7, 20))
|
||||
|
||||
var errorNoArgs = new Chowder();
|
||||
>errorNoArgs : Symbol(errorNoArgs, Decl(generic.js, 18, 3))
|
||||
|
||||
@@ -10,7 +10,7 @@ function Wagon(numberOxen) {
|
||||
this.numberOxen = numberOxen
|
||||
>this.numberOxen = numberOxen : number
|
||||
>this.numberOxen : number
|
||||
>this : Wagon
|
||||
>this : this
|
||||
>numberOxen : number
|
||||
>numberOxen : number
|
||||
}
|
||||
@@ -72,11 +72,11 @@ Wagon.prototype.speed = function () {
|
||||
return this.numberOxen / this.weight()
|
||||
>this.numberOxen / this.weight() : number
|
||||
>this.numberOxen : number
|
||||
>this : Wagon
|
||||
>this : this
|
||||
>numberOxen : number
|
||||
>this.weight() : number
|
||||
>this.weight : (supplies?: any[]) => number
|
||||
>this : Wagon
|
||||
>this : this
|
||||
>weight : (supplies?: any[]) => number
|
||||
}
|
||||
// ok
|
||||
@@ -245,27 +245,27 @@ function Soup(flavour) {
|
||||
/** @extends {Soup<{ claim: "ignorant" | "malicious" }>} */
|
||||
class Chowder extends Soup {
|
||||
>Chowder : Chowder
|
||||
>Soup : typeof Soup
|
||||
>Soup : Soup<{ claim: "ignorant" | "malicious"; }>
|
||||
|
||||
log() {
|
||||
>log : () => any
|
||||
>log : () => { claim: "ignorant" | "malicious"; }
|
||||
|
||||
return this.flavour
|
||||
>this.flavour : any
|
||||
>this.flavour : { claim: "ignorant" | "malicious"; }
|
||||
>this : this
|
||||
>flavour : any
|
||||
>flavour : { claim: "ignorant" | "malicious"; }
|
||||
}
|
||||
}
|
||||
|
||||
var soup = new Soup(1);
|
||||
>soup : typeof Soup
|
||||
>new Soup(1) : typeof Soup
|
||||
>soup : Soup<number>
|
||||
>new Soup(1) : Soup<number>
|
||||
>Soup : typeof Soup
|
||||
>1 : 1
|
||||
|
||||
soup.flavour
|
||||
>soup.flavour : number
|
||||
>soup : typeof Soup
|
||||
>soup : Soup<number>
|
||||
>flavour : number
|
||||
|
||||
var chowder = new Chowder({ claim: "ignorant" });
|
||||
@@ -277,11 +277,11 @@ var chowder = new Chowder({ claim: "ignorant" });
|
||||
>"ignorant" : "ignorant"
|
||||
|
||||
chowder.flavour.claim
|
||||
>chowder.flavour.claim : any
|
||||
>chowder.flavour : any
|
||||
>chowder.flavour.claim : "ignorant" | "malicious"
|
||||
>chowder.flavour : { claim: "ignorant" | "malicious"; }
|
||||
>chowder : Chowder
|
||||
>flavour : any
|
||||
>claim : any
|
||||
>flavour : { claim: "ignorant" | "malicious"; }
|
||||
>claim : "ignorant" | "malicious"
|
||||
|
||||
var errorNoArgs = new Chowder();
|
||||
>errorNoArgs : any
|
||||
|
||||
@@ -69,7 +69,7 @@ function C3() {
|
||||
>!(this instanceof C3) : boolean
|
||||
>(this instanceof C3) : boolean
|
||||
>this instanceof C3 : boolean
|
||||
>this : C3
|
||||
>this : this
|
||||
>C3 : typeof C3
|
||||
>new C3() : C3
|
||||
>C3 : typeof C3
|
||||
@@ -95,7 +95,7 @@ var C4 = function () {
|
||||
>!(this instanceof C4) : boolean
|
||||
>(this instanceof C4) : boolean
|
||||
>this instanceof C4 : boolean
|
||||
>this : C4
|
||||
>this : this
|
||||
>C4 : typeof C4
|
||||
>new C4() : C4
|
||||
>C4 : typeof C4
|
||||
@@ -144,7 +144,7 @@ function C6() {
|
||||
this.functions = [x => x, x => x + 1, x => x - 1]
|
||||
>this.functions = [x => x, x => x + 1, x => x - 1] : ((x: any) => any)[]
|
||||
>this.functions : ((x: any) => any)[]
|
||||
>this : C6
|
||||
>this : this
|
||||
>functions : ((x: any) => any)[]
|
||||
>[x => x, x => x + 1, x => x - 1] : ((x: any) => any)[]
|
||||
>x => x : (x: any) => any
|
||||
|
||||
@@ -40,7 +40,7 @@ B.prototype.m = function() { this.x = 2; }
|
||||
>function() { this.x = 2; } : () => void
|
||||
>this.x = 2 : 2
|
||||
>this.x : number
|
||||
>this : B
|
||||
>this : this
|
||||
>x : number
|
||||
>2 : 2
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ A.prototype.z = function f(n) {
|
||||
>n + this.x : number
|
||||
>n : number
|
||||
>this.x : number
|
||||
>this : A
|
||||
>this : this
|
||||
>x : number
|
||||
}
|
||||
/** @param {number} m */
|
||||
|
||||
@@ -23,7 +23,7 @@ C.prototype.m = function() {
|
||||
this.y = 12
|
||||
>this.y = 12 : 12
|
||||
>this.y : number | undefined
|
||||
>this : C
|
||||
>this : this
|
||||
>y : number | undefined
|
||||
>12 : 12
|
||||
}
|
||||
|
||||
@@ -269,7 +269,7 @@ function AtTop(val) { this.val = val }
|
||||
>val : any
|
||||
>this.val = val : any
|
||||
>this.val : any
|
||||
>this : AtTop
|
||||
>this : this
|
||||
>val : any
|
||||
>val : any
|
||||
|
||||
|
||||
@@ -3,5 +3,5 @@ export function f() { }
|
||||
>f : typeof f
|
||||
|
||||
export = f;
|
||||
>f : () => void
|
||||
>f : { (): void; f: typeof import("tests/cases/compiler/es5ExportEquals").f; }
|
||||
|
||||
|
||||
@@ -3,5 +3,5 @@ export function f() { }
|
||||
>f : typeof f
|
||||
|
||||
export = f;
|
||||
>f : () => void
|
||||
>f : { (): void; f: typeof import("tests/cases/compiler/es6ExportEquals").f; }
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ OOOrder.prototype.m = function () {
|
||||
this.p = 1
|
||||
>this.p = 1 : 1
|
||||
>this.p : number
|
||||
>this : OOOrder
|
||||
>this : this
|
||||
>p : number
|
||||
>1 : 1
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
=== tests/cases/compiler/enumDef.js ===
|
||||
var Host = {};
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 1, 22) ... and 2 more)
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 10, 21))
|
||||
|
||||
Host.UserMetrics = {};
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 1, 22) ... and 2 more)
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 10, 21))
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
|
||||
/** @enum {number} */
|
||||
Host.UserMetrics.Action = {
|
||||
>Host.UserMetrics.Action : Symbol(Host.UserMetrics.Action, Decl(enumDef.js, 1, 22), Decl(enumDef.js, 3, 17), Decl(enumDef.js, 2, 4))
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 1, 22) ... and 2 more)
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 10, 21))
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
>Action : Symbol(Host.UserMetrics.Action, Decl(enumDef.js, 1, 22), Decl(enumDef.js, 3, 17), Decl(enumDef.js, 2, 4))
|
||||
|
||||
WindowDocked: 1,
|
||||
@@ -36,9 +36,9 @@ Host.UserMetrics.Action = {
|
||||
*/
|
||||
Host.UserMetrics.Blah = {
|
||||
>Host.UserMetrics.Blah : Symbol(Host.UserMetrics.Blah, Decl(enumDef.js, 8, 2), Decl(enumDef.js, 15, 17), Decl(enumDef.js, 13, 3))
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 1, 22) ... and 2 more)
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 10, 21))
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
>Blah : Symbol(Host.UserMetrics.Blah, Decl(enumDef.js, 8, 2), Decl(enumDef.js, 15, 17), Decl(enumDef.js, 13, 3))
|
||||
|
||||
x: 12
|
||||
@@ -68,9 +68,9 @@ Other.Cls = class {
|
||||
>this : Symbol(Cls, Decl(index.js, 1, 11))
|
||||
>method : Symbol(Cls.method, Decl(index.js, 1, 19))
|
||||
>Host.UserMetrics.Action : Symbol(Host.UserMetrics.Action, Decl(enumDef.js, 1, 22), Decl(enumDef.js, 3, 17), Decl(enumDef.js, 2, 4))
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 1, 22) ... and 2 more)
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 10, 26) ... and 1 more)
|
||||
>Host.UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
>Host : Symbol(Host, Decl(enumDef.js, 0, 3), Decl(enumDef.js, 0, 14), Decl(enumDef.js, 1, 22), Decl(enumDef.js, 8, 2), Decl(enumDef.js, 10, 21))
|
||||
>UserMetrics : Symbol(Host.UserMetrics, Decl(enumDef.js, 0, 14), Decl(enumDef.js, 3, 5), Decl(enumDef.js, 15, 5), Decl(enumDef.js, 10, 26))
|
||||
>Action : Symbol(Host.UserMetrics.Action, Decl(enumDef.js, 1, 22), Decl(enumDef.js, 3, 17), Decl(enumDef.js, 2, 4))
|
||||
}
|
||||
}
|
||||
|
||||
+3
-6
@@ -6,11 +6,10 @@ tests/cases/compiler/index.js(9,24): error TS7006: Parameter 'ratio' implicitly
|
||||
tests/cases/compiler/index.js(10,20): error TS7006: Parameter 'ratio' implicitly has an 'any' type.
|
||||
tests/cases/compiler/index.js(11,21): error TS7006: Parameter 'ratio' implicitly has an 'any' type.
|
||||
tests/cases/compiler/index.js(13,21): error TS7006: Parameter 'ratio' implicitly has an 'any' type.
|
||||
tests/cases/compiler/index.js(14,2): error TS7023: 'toJSON' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions.
|
||||
tests/cases/compiler/index.js(14,35): error TS2339: Property 'rgb' does not exist on type 'Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }'.
|
||||
tests/cases/compiler/index.js(14,35): error TS2339: Property 'rgb' does not exist on type 'Color'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/index.js (10 errors) ====
|
||||
==== tests/cases/compiler/index.js (9 errors) ====
|
||||
function Color(obj) {
|
||||
~~~
|
||||
!!! error TS7006: Parameter 'obj' implicitly has an 'any' type.
|
||||
@@ -41,8 +40,6 @@ tests/cases/compiler/index.js(14,35): error TS2339: Property 'rgb' does not exis
|
||||
~~~~~
|
||||
!!! error TS7006: Parameter 'ratio' implicitly has an 'any' type.
|
||||
toJSON: function () {return this.rgb();},
|
||||
~~~~~~
|
||||
!!! error TS7023: 'toJSON' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions.
|
||||
~~~
|
||||
!!! error TS2339: Property 'rgb' does not exist on type 'Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }'.
|
||||
!!! error TS2339: Property 'rgb' does not exist on type 'Color'.
|
||||
};
|
||||
@@ -14,39 +14,49 @@ Color.prototype = {
|
||||
|
||||
negate: function () {return this;},
|
||||
>negate : Symbol(negate, Decl(index.js, 3, 19))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
lighten: function (ratio) {return this;},
|
||||
>lighten : Symbol(lighten, Decl(index.js, 4, 36))
|
||||
>ratio : Symbol(ratio, Decl(index.js, 5, 20))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
darken: function (ratio) {return this;},
|
||||
>darken : Symbol(darken, Decl(index.js, 5, 42))
|
||||
>ratio : Symbol(ratio, Decl(index.js, 6, 19))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
saturate: function (ratio) {return this;},
|
||||
>saturate : Symbol(saturate, Decl(index.js, 6, 41))
|
||||
>ratio : Symbol(ratio, Decl(index.js, 7, 21))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
desaturate: function (ratio) {return this;},
|
||||
>desaturate : Symbol(desaturate, Decl(index.js, 7, 43))
|
||||
>ratio : Symbol(ratio, Decl(index.js, 8, 23))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
whiten: function (ratio) {return this;},
|
||||
>whiten : Symbol(whiten, Decl(index.js, 8, 45))
|
||||
>ratio : Symbol(ratio, Decl(index.js, 9, 19))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
blacken: function (ratio) {return this;},
|
||||
>blacken : Symbol(blacken, Decl(index.js, 9, 41))
|
||||
>ratio : Symbol(ratio, Decl(index.js, 10, 20))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
greyscale: function () {return this;},
|
||||
>greyscale : Symbol(greyscale, Decl(index.js, 10, 42))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
clearer: function (ratio) {return this;},
|
||||
>clearer : Symbol(clearer, Decl(index.js, 11, 39))
|
||||
>ratio : Symbol(ratio, Decl(index.js, 12, 20))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
toJSON: function () {return this.rgb();},
|
||||
>toJSON : Symbol(toJSON, Decl(index.js, 12, 42))
|
||||
>this : Symbol(Color, Decl(index.js, 0, 0), Decl(index.js, 2, 2))
|
||||
|
||||
};
|
||||
|
||||
@@ -12,70 +12,70 @@ function Color(obj) {
|
||||
|
||||
};
|
||||
Color.prototype = {
|
||||
>Color.prototype = { negate: function () {return this;}, lighten: function (ratio) {return this;}, darken: function (ratio) {return this;}, saturate: function (ratio) {return this;}, desaturate: function (ratio) {return this;}, whiten: function (ratio) {return this;}, blacken: function (ratio) {return this;}, greyscale: function () {return this;}, clearer: function (ratio) {return this;}, toJSON: function () {return this.rgb();},} : { negate: () => Color & { negate: any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; lighten: (ratio: any) => Color & { negate: () => Color & any; lighten: any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; darken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; saturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; desaturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; whiten: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; blacken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; greyscale: () => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; clearer: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: any; toJSON: () => any; }; toJSON: () => any; }
|
||||
>Color.prototype : { negate: () => Color & { negate: any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; lighten: (ratio: any) => Color & { negate: () => Color & any; lighten: any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; darken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; saturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; desaturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; whiten: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; blacken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; greyscale: () => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; clearer: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: any; toJSON: () => any; }; toJSON: () => any; }
|
||||
>Color.prototype = { negate: function () {return this;}, lighten: function (ratio) {return this;}, darken: function (ratio) {return this;}, saturate: function (ratio) {return this;}, desaturate: function (ratio) {return this;}, whiten: function (ratio) {return this;}, blacken: function (ratio) {return this;}, greyscale: function () {return this;}, clearer: function (ratio) {return this;}, toJSON: function () {return this.rgb();},} : { negate: () => this; lighten: (ratio: any) => this; darken: (ratio: any) => this; saturate: (ratio: any) => this; desaturate: (ratio: any) => this; whiten: (ratio: any) => this; blacken: (ratio: any) => this; greyscale: () => this; clearer: (ratio: any) => this; toJSON: () => any; }
|
||||
>Color.prototype : { negate: () => this; lighten: (ratio: any) => this; darken: (ratio: any) => this; saturate: (ratio: any) => this; desaturate: (ratio: any) => this; whiten: (ratio: any) => this; blacken: (ratio: any) => this; greyscale: () => this; clearer: (ratio: any) => this; toJSON: () => any; }
|
||||
>Color : typeof Color
|
||||
>prototype : { negate: () => Color & { negate: any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; lighten: (ratio: any) => Color & { negate: () => Color & any; lighten: any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; darken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; saturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; desaturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; whiten: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; blacken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; greyscale: () => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; clearer: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: any; toJSON: () => any; }; toJSON: () => any; }
|
||||
>{ negate: function () {return this;}, lighten: function (ratio) {return this;}, darken: function (ratio) {return this;}, saturate: function (ratio) {return this;}, desaturate: function (ratio) {return this;}, whiten: function (ratio) {return this;}, blacken: function (ratio) {return this;}, greyscale: function () {return this;}, clearer: function (ratio) {return this;}, toJSON: function () {return this.rgb();},} : { negate: () => Color & { negate: any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; lighten: (ratio: any) => Color & { negate: () => Color & any; lighten: any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; darken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; saturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; desaturate: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; whiten: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; blacken: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; greyscale: () => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: any; clearer: (ratio: any) => Color & any; toJSON: () => any; }; clearer: (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: any; toJSON: () => any; }; toJSON: () => any; }
|
||||
>prototype : { negate: () => this; lighten: (ratio: any) => this; darken: (ratio: any) => this; saturate: (ratio: any) => this; desaturate: (ratio: any) => this; whiten: (ratio: any) => this; blacken: (ratio: any) => this; greyscale: () => this; clearer: (ratio: any) => this; toJSON: () => any; }
|
||||
>{ negate: function () {return this;}, lighten: function (ratio) {return this;}, darken: function (ratio) {return this;}, saturate: function (ratio) {return this;}, desaturate: function (ratio) {return this;}, whiten: function (ratio) {return this;}, blacken: function (ratio) {return this;}, greyscale: function () {return this;}, clearer: function (ratio) {return this;}, toJSON: function () {return this.rgb();},} : { negate: () => this; lighten: (ratio: any) => this; darken: (ratio: any) => this; saturate: (ratio: any) => this; desaturate: (ratio: any) => this; whiten: (ratio: any) => this; blacken: (ratio: any) => this; greyscale: () => this; clearer: (ratio: any) => this; toJSON: () => any; }
|
||||
|
||||
negate: function () {return this;},
|
||||
>negate : () => Color & { negate: any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function () {return this;} : () => Color & { negate: any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>negate : () => this
|
||||
>function () {return this;} : () => this
|
||||
>this : this
|
||||
|
||||
lighten: function (ratio) {return this;},
|
||||
>lighten : (ratio: any) => Color & { negate: () => Color & any; lighten: any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function (ratio) {return this;} : (ratio: any) => Color & { negate: () => Color & any; lighten: any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>lighten : (ratio: any) => this
|
||||
>function (ratio) {return this;} : (ratio: any) => this
|
||||
>ratio : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
|
||||
darken: function (ratio) {return this;},
|
||||
>darken : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function (ratio) {return this;} : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>darken : (ratio: any) => this
|
||||
>function (ratio) {return this;} : (ratio: any) => this
|
||||
>ratio : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
|
||||
saturate: function (ratio) {return this;},
|
||||
>saturate : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function (ratio) {return this;} : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>saturate : (ratio: any) => this
|
||||
>function (ratio) {return this;} : (ratio: any) => this
|
||||
>ratio : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
|
||||
desaturate: function (ratio) {return this;},
|
||||
>desaturate : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function (ratio) {return this;} : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>desaturate : (ratio: any) => this
|
||||
>function (ratio) {return this;} : (ratio: any) => this
|
||||
>ratio : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
|
||||
whiten: function (ratio) {return this;},
|
||||
>whiten : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function (ratio) {return this;} : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>whiten : (ratio: any) => this
|
||||
>function (ratio) {return this;} : (ratio: any) => this
|
||||
>ratio : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
|
||||
blacken: function (ratio) {return this;},
|
||||
>blacken : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function (ratio) {return this;} : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>blacken : (ratio: any) => this
|
||||
>function (ratio) {return this;} : (ratio: any) => this
|
||||
>ratio : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
|
||||
greyscale: function () {return this;},
|
||||
>greyscale : () => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>function () {return this;} : () => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>greyscale : () => this
|
||||
>function () {return this;} : () => this
|
||||
>this : this
|
||||
|
||||
clearer: function (ratio) {return this;},
|
||||
>clearer : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: any; toJSON: () => any; }
|
||||
>function (ratio) {return this;} : (ratio: any) => Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: any; toJSON: () => any; }
|
||||
>clearer : (ratio: any) => this
|
||||
>function (ratio) {return this;} : (ratio: any) => this
|
||||
>ratio : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
|
||||
toJSON: function () {return this.rgb();},
|
||||
>toJSON : () => any
|
||||
>function () {return this.rgb();} : () => any
|
||||
>this.rgb() : any
|
||||
>this.rgb : any
|
||||
>this : Color & { negate: () => Color & any; lighten: (ratio: any) => Color & any; darken: (ratio: any) => Color & any; saturate: (ratio: any) => Color & any; desaturate: (ratio: any) => Color & any; whiten: (ratio: any) => Color & any; blacken: (ratio: any) => Color & any; greyscale: () => Color & any; clearer: (ratio: any) => Color & any; toJSON: () => any; }
|
||||
>this : this
|
||||
>rgb : any
|
||||
|
||||
};
|
||||
|
||||
@@ -93,7 +93,7 @@ function D(n) {
|
||||
this.length = n;
|
||||
>this.length = n : number
|
||||
>this.length : number
|
||||
>this : D
|
||||
>this : this
|
||||
>length : number
|
||||
>n : number
|
||||
}
|
||||
@@ -152,7 +152,7 @@ var E = function(n) {
|
||||
this.not_length_on_purpose = n;
|
||||
>this.not_length_on_purpose = n : number
|
||||
>this.not_length_on_purpose : number
|
||||
>this : E
|
||||
>this : this
|
||||
>not_length_on_purpose : number
|
||||
>n : number
|
||||
|
||||
|
||||
@@ -42,38 +42,38 @@ Zet.prototype.add = function(v, id) {
|
||||
this.u = v || this.t
|
||||
>this.u = v || this.t : T
|
||||
>this.u : T
|
||||
>this : Zet
|
||||
>this : this
|
||||
>u : T
|
||||
>v || this.t : T
|
||||
>v : T
|
||||
>this.t : T
|
||||
>this : Zet
|
||||
>this : this
|
||||
>t : T
|
||||
|
||||
return id(this.u)
|
||||
>id(this.u) : T
|
||||
>id : (u: T) => T
|
||||
>this.u : T
|
||||
>this : Zet
|
||||
>this : this
|
||||
>u : T
|
||||
}
|
||||
var z = new Zet(1)
|
||||
>z : typeof Zet
|
||||
>new Zet(1) : typeof Zet
|
||||
>z : Zet<number>
|
||||
>new Zet(1) : Zet<number>
|
||||
>Zet : typeof Zet
|
||||
>1 : 1
|
||||
|
||||
z.t = 2
|
||||
>z.t = 2 : 2
|
||||
>z.t : number
|
||||
>z : typeof Zet
|
||||
>z : Zet<number>
|
||||
>t : number
|
||||
>2 : 2
|
||||
|
||||
z.u = false
|
||||
>z.u = false : false
|
||||
>z.u : number
|
||||
>z : typeof Zet
|
||||
>z : Zet<number>
|
||||
>u : number
|
||||
>false : false
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js(21,1): error TS2322: Type 'false' is not assignable to type 'number'.
|
||||
tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js(26,15): error TS2304: Cannot find name 'T'.
|
||||
tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js(28,15): error TS2304: Cannot find name 'T'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js (2 errors) ====
|
||||
@@ -26,6 +26,8 @@ tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js(26,15): error
|
||||
z.u = false
|
||||
~~~
|
||||
!!! error TS2322: Type 'false' is not assignable to type 'number'.
|
||||
/** @type {number} */
|
||||
let answer = z.add(3, { nested: 4 })
|
||||
|
||||
// lookup in typedef should not crash the compiler, even when the type is unknown
|
||||
/**
|
||||
|
||||
@@ -54,6 +54,14 @@ z.u = false
|
||||
>z : Symbol(z, Decl(templateTagWithNestedTypeLiteral.js, 18, 3), Decl(templateTagWithNestedTypeLiteral.js, 18, 18), Decl(templateTagWithNestedTypeLiteral.js, 19, 7))
|
||||
>u : Symbol(Zet.u, Decl(templateTagWithNestedTypeLiteral.js, 4, 17), Decl(templateTagWithNestedTypeLiteral.js, 14, 36))
|
||||
|
||||
/** @type {number} */
|
||||
let answer = z.add(3, { nested: 4 })
|
||||
>answer : Symbol(answer, Decl(templateTagWithNestedTypeLiteral.js, 22, 3))
|
||||
>z.add : Symbol(Zet.add, Decl(templateTagWithNestedTypeLiteral.js, 8, 1))
|
||||
>z : Symbol(z, Decl(templateTagWithNestedTypeLiteral.js, 18, 3), Decl(templateTagWithNestedTypeLiteral.js, 18, 18), Decl(templateTagWithNestedTypeLiteral.js, 19, 7))
|
||||
>add : Symbol(Zet.add, Decl(templateTagWithNestedTypeLiteral.js, 8, 1))
|
||||
>nested : Symbol(nested, Decl(templateTagWithNestedTypeLiteral.js, 22, 23))
|
||||
|
||||
// lookup in typedef should not crash the compiler, even when the type is unknown
|
||||
/**
|
||||
* @typedef {Object} A
|
||||
@@ -61,6 +69,6 @@ z.u = false
|
||||
*/
|
||||
/** @type {A} */
|
||||
const options = { value: null };
|
||||
>options : Symbol(options, Decl(templateTagWithNestedTypeLiteral.js, 28, 5))
|
||||
>value : Symbol(value, Decl(templateTagWithNestedTypeLiteral.js, 28, 17))
|
||||
>options : Symbol(options, Decl(templateTagWithNestedTypeLiteral.js, 30, 5))
|
||||
>value : Symbol(value, Decl(templateTagWithNestedTypeLiteral.js, 30, 17))
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ Zet.prototype.add = function(v, o) {
|
||||
this.u = v || o.nested
|
||||
>this.u = v || o.nested : T
|
||||
>this.u : T
|
||||
>this : Zet
|
||||
>this : this
|
||||
>u : T
|
||||
>v || o.nested : T
|
||||
>v : T
|
||||
@@ -49,29 +49,41 @@ Zet.prototype.add = function(v, o) {
|
||||
|
||||
return this.u
|
||||
>this.u : T
|
||||
>this : Zet
|
||||
>this : this
|
||||
>u : T
|
||||
}
|
||||
var z = new Zet(1)
|
||||
>z : typeof Zet
|
||||
>new Zet(1) : typeof Zet
|
||||
>z : Zet<number>
|
||||
>new Zet(1) : Zet<number>
|
||||
>Zet : typeof Zet
|
||||
>1 : 1
|
||||
|
||||
z.t = 2
|
||||
>z.t = 2 : 2
|
||||
>z.t : number
|
||||
>z : typeof Zet
|
||||
>z : Zet<number>
|
||||
>t : number
|
||||
>2 : 2
|
||||
|
||||
z.u = false
|
||||
>z.u = false : false
|
||||
>z.u : number
|
||||
>z : typeof Zet
|
||||
>z : Zet<number>
|
||||
>u : number
|
||||
>false : false
|
||||
|
||||
/** @type {number} */
|
||||
let answer = z.add(3, { nested: 4 })
|
||||
>answer : number
|
||||
>z.add(3, { nested: 4 }) : number
|
||||
>z.add : (v: number, o: { nested: number; }) => number
|
||||
>z : Zet<number>
|
||||
>add : (v: number, o: { nested: number; }) => number
|
||||
>3 : 3
|
||||
>{ nested: 4 } : { nested: number; }
|
||||
>nested : number
|
||||
>4 : 4
|
||||
|
||||
// lookup in typedef should not crash the compiler, even when the type is unknown
|
||||
/**
|
||||
* @typedef {Object} A
|
||||
|
||||
@@ -12,7 +12,7 @@ function Multimap() {
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>{} : {}
|
||||
|
||||
@@ -35,7 +35,7 @@ Multimap.prototype.get = function (key) {
|
||||
return this._map[key + ''];
|
||||
>this._map[key + ''] : V
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>key + '' : string
|
||||
>key : K
|
||||
@@ -56,7 +56,7 @@ var Multimap2 = function() {
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap2
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>{} : {}
|
||||
|
||||
@@ -79,7 +79,7 @@ Multimap2.prototype.get = function (key) {
|
||||
return this._map[key + ''];
|
||||
>this._map[key + ''] : V
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap2
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>key + '' : string
|
||||
>key : K
|
||||
@@ -107,7 +107,7 @@ Ns.Multimap3 = function() {
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap3
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>{} : {}
|
||||
|
||||
@@ -132,7 +132,7 @@ Ns.Multimap3.prototype.get = function (key) {
|
||||
return this._map[key + ''];
|
||||
>this._map[key + ''] : V
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap3
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>key + '' : string
|
||||
>key : K
|
||||
|
||||
@@ -11,6 +11,7 @@ function Multimap() {
|
||||
/** @type {Object<string, V>} TODO: Remove the prototype from the fresh object */
|
||||
this._map = {};
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 6, 21))
|
||||
>this : Symbol(Multimap, Decl(a.js, 0, 0), Decl(a.js, 9, 2))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 6, 21))
|
||||
|
||||
};
|
||||
@@ -30,6 +31,7 @@ Multimap.prototype = {
|
||||
|
||||
return this._map[key + ''];
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 6, 21))
|
||||
>this : Symbol(Multimap, Decl(a.js, 0, 0), Decl(a.js, 9, 2))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 6, 21))
|
||||
>key : Symbol(key, Decl(a.js, 16, 8))
|
||||
}
|
||||
@@ -47,6 +49,7 @@ var Multimap2 = function() {
|
||||
/** @type {Object<string, V>} TODO: Remove the prototype from the fresh object */
|
||||
this._map = {};
|
||||
>this._map : Symbol(Multimap2._map, Decl(a.js, 27, 28))
|
||||
>this : Symbol(Multimap2, Decl(a.js, 27, 15))
|
||||
>_map : Symbol(Multimap2._map, Decl(a.js, 27, 28))
|
||||
|
||||
};
|
||||
@@ -66,6 +69,7 @@ Multimap2.prototype = {
|
||||
|
||||
return this._map[key + ''];
|
||||
>this._map : Symbol(Multimap2._map, Decl(a.js, 27, 28))
|
||||
>this : Symbol(Multimap2, Decl(a.js, 27, 15))
|
||||
>_map : Symbol(Multimap2._map, Decl(a.js, 27, 28))
|
||||
>key : Symbol(key, Decl(a.js, 37, 18))
|
||||
}
|
||||
@@ -88,6 +92,7 @@ Ns.Multimap3 = function() {
|
||||
/** @type {Object<string, V>} TODO: Remove the prototype from the fresh object */
|
||||
this._map = {};
|
||||
>this._map : Symbol(Multimap3._map, Decl(a.js, 49, 27))
|
||||
>this : Symbol(Multimap3, Decl(a.js, 49, 14))
|
||||
>_map : Symbol(Multimap3._map, Decl(a.js, 49, 27))
|
||||
|
||||
};
|
||||
@@ -109,6 +114,7 @@ Ns.Multimap3.prototype = {
|
||||
|
||||
return this._map[key + ''];
|
||||
>this._map : Symbol(Multimap3._map, Decl(a.js, 49, 27))
|
||||
>this : Symbol(Multimap3, Decl(a.js, 49, 14))
|
||||
>_map : Symbol(Multimap3._map, Decl(a.js, 49, 27))
|
||||
>key : Symbol(key, Decl(a.js, 59, 8))
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ function Multimap() {
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap & { get(key: K): V; }
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>{} : {}
|
||||
|
||||
@@ -36,7 +36,7 @@ Multimap.prototype = {
|
||||
return this._map[key + ''];
|
||||
>this._map[key + ''] : V
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap & { get(key: K): V; }
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>key + '' : string
|
||||
>key : K
|
||||
@@ -58,7 +58,7 @@ var Multimap2 = function() {
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap2 & { get: (key: K) => V; }
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>{} : {}
|
||||
|
||||
@@ -83,7 +83,7 @@ Multimap2.prototype = {
|
||||
return this._map[key + ''];
|
||||
>this._map[key + ''] : V
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap2 & { get: (key: K) => V; }
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>key + '' : string
|
||||
>key : K
|
||||
@@ -112,7 +112,7 @@ Ns.Multimap3 = function() {
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap3 & { get(key: K): V; }
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>{} : {}
|
||||
|
||||
@@ -138,7 +138,7 @@ Ns.Multimap3.prototype = {
|
||||
return this._map[key + ''];
|
||||
>this._map[key + ''] : V
|
||||
>this._map : { [x: string]: V; }
|
||||
>this : Multimap3 & { get(key: K): V; }
|
||||
>this : this
|
||||
>_map : { [x: string]: V; }
|
||||
>key + '' : string
|
||||
>key : K
|
||||
|
||||
@@ -43,7 +43,7 @@ A.prototype.y = A.prototype.z = function f(n) {
|
||||
>n + this.x : number
|
||||
>n : number
|
||||
>this.x : number
|
||||
>this : A
|
||||
>this : this
|
||||
>x : number
|
||||
}
|
||||
/** @param {number} m */
|
||||
|
||||
@@ -14,80 +14,80 @@ Class.prototype.containsError = function () { return this.notPresent; };
|
||||
>containsError : any
|
||||
>function () { return this.notPresent; } : () => any
|
||||
>this.notPresent : error
|
||||
>this : Class
|
||||
>this : this
|
||||
>notPresent : any
|
||||
|
||||
// lots of methods that return this, which caused out-of-memory in #9527
|
||||
Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; };
|
||||
>Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => Class
|
||||
>Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => this
|
||||
>Class.prototype.m1 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m1 : any
|
||||
>function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => Class
|
||||
>function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => this
|
||||
>a : any
|
||||
>b : any
|
||||
>c : any
|
||||
>d : any
|
||||
>tx : any
|
||||
>ty : any
|
||||
>this : Class
|
||||
>this : this
|
||||
|
||||
Class.prototype.m2 = function (x, y) { return this; };
|
||||
>Class.prototype.m2 = function (x, y) { return this; } : (x: any, y: any) => Class
|
||||
>Class.prototype.m2 = function (x, y) { return this; } : (x: any, y: any) => this
|
||||
>Class.prototype.m2 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m2 : any
|
||||
>function (x, y) { return this; } : (x: any, y: any) => Class
|
||||
>function (x, y) { return this; } : (x: any, y: any) => this
|
||||
>x : any
|
||||
>y : any
|
||||
>this : Class
|
||||
>this : this
|
||||
|
||||
Class.prototype.m3 = function (x, y) { return this; };
|
||||
>Class.prototype.m3 = function (x, y) { return this; } : (x: any, y: any) => Class
|
||||
>Class.prototype.m3 = function (x, y) { return this; } : (x: any, y: any) => this
|
||||
>Class.prototype.m3 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m3 : any
|
||||
>function (x, y) { return this; } : (x: any, y: any) => Class
|
||||
>function (x, y) { return this; } : (x: any, y: any) => this
|
||||
>x : any
|
||||
>y : any
|
||||
>this : Class
|
||||
>this : this
|
||||
|
||||
Class.prototype.m4 = function (angle) { return this; };
|
||||
>Class.prototype.m4 = function (angle) { return this; } : (angle: any) => Class
|
||||
>Class.prototype.m4 = function (angle) { return this; } : (angle: any) => this
|
||||
>Class.prototype.m4 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m4 : any
|
||||
>function (angle) { return this; } : (angle: any) => Class
|
||||
>function (angle) { return this; } : (angle: any) => this
|
||||
>angle : any
|
||||
>this : Class
|
||||
>this : this
|
||||
|
||||
Class.prototype.m5 = function (matrix) { return this; };
|
||||
>Class.prototype.m5 = function (matrix) { return this; } : (matrix: any) => Class
|
||||
>Class.prototype.m5 = function (matrix) { return this; } : (matrix: any) => this
|
||||
>Class.prototype.m5 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m5 : any
|
||||
>function (matrix) { return this; } : (matrix: any) => Class
|
||||
>function (matrix) { return this; } : (matrix: any) => this
|
||||
>matrix : any
|
||||
>this : Class
|
||||
>this : this
|
||||
|
||||
Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; };
|
||||
>Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => Class
|
||||
>Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => this
|
||||
>Class.prototype.m6 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m6 : any
|
||||
>function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => Class
|
||||
>function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => this
|
||||
>x : any
|
||||
>y : any
|
||||
>pivotX : any
|
||||
@@ -97,37 +97,37 @@ Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, s
|
||||
>rotation : any
|
||||
>skewX : any
|
||||
>skewY : any
|
||||
>this : Class
|
||||
>this : this
|
||||
|
||||
Class.prototype.m7 = function(matrix) { return this; };
|
||||
>Class.prototype.m7 = function(matrix) { return this; } : (matrix: any) => Class
|
||||
>Class.prototype.m7 = function(matrix) { return this; } : (matrix: any) => this
|
||||
>Class.prototype.m7 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m7 : any
|
||||
>function(matrix) { return this; } : (matrix: any) => Class
|
||||
>function(matrix) { return this; } : (matrix: any) => this
|
||||
>matrix : any
|
||||
>this : Class
|
||||
>this : this
|
||||
|
||||
Class.prototype.m8 = function() { return this; };
|
||||
>Class.prototype.m8 = function() { return this; } : () => Class
|
||||
>Class.prototype.m8 = function() { return this; } : () => this
|
||||
>Class.prototype.m8 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m8 : any
|
||||
>function() { return this; } : () => Class
|
||||
>this : Class
|
||||
>function() { return this; } : () => this
|
||||
>this : this
|
||||
|
||||
Class.prototype.m9 = function () { return this; };
|
||||
>Class.prototype.m9 = function () { return this; } : () => Class
|
||||
>Class.prototype.m9 = function () { return this; } : () => this
|
||||
>Class.prototype.m9 : any
|
||||
>Class.prototype : any
|
||||
>Class : typeof Class
|
||||
>prototype : any
|
||||
>m9 : any
|
||||
>function () { return this; } : () => Class
|
||||
>this : Class
|
||||
>function () { return this; } : () => this
|
||||
>this : this
|
||||
|
||||
|
||||
|
||||
@@ -18,6 +18,6 @@ module.exports = alias
|
||||
|
||||
=== tests/cases/conformance/salsa/importer.js ===
|
||||
import('./bug28014')
|
||||
>import('./bug28014') : Promise<() => void>
|
||||
>import('./bug28014') : Promise<{ (): void; version: number; }>
|
||||
>'./bug28014' : "./bug28014"
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ C.prototype.m = function() {
|
||||
this.nothing();
|
||||
>this.nothing() : error
|
||||
>this.nothing : error
|
||||
>this : C
|
||||
>this : this
|
||||
>nothing : any
|
||||
}
|
||||
class X {
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
=== tests/cases/conformance/salsa/propertiesOfGenericConstructorFunctions.js ===
|
||||
/**
|
||||
* @template {string} K
|
||||
* @template V
|
||||
* @param {string} ik
|
||||
* @param {V} iv
|
||||
*/
|
||||
function Multimap(ik, iv) {
|
||||
>Multimap : Symbol(Multimap, Decl(propertiesOfGenericConstructorFunctions.js, 0, 0))
|
||||
>ik : Symbol(ik, Decl(propertiesOfGenericConstructorFunctions.js, 6, 18))
|
||||
>iv : Symbol(iv, Decl(propertiesOfGenericConstructorFunctions.js, 6, 21))
|
||||
|
||||
/** @type {{ [s: string]: V }} */
|
||||
this._map = {};
|
||||
>_map : Symbol(Multimap._map, Decl(propertiesOfGenericConstructorFunctions.js, 6, 27))
|
||||
|
||||
// without type annotation
|
||||
this._map2 = { [ik]: iv };
|
||||
>_map2 : Symbol(Multimap._map2, Decl(propertiesOfGenericConstructorFunctions.js, 8, 19))
|
||||
>[ik] : Symbol([ik], Decl(propertiesOfGenericConstructorFunctions.js, 10, 18))
|
||||
>ik : Symbol(ik, Decl(propertiesOfGenericConstructorFunctions.js, 6, 18))
|
||||
>iv : Symbol(iv, Decl(propertiesOfGenericConstructorFunctions.js, 6, 21))
|
||||
|
||||
};
|
||||
|
||||
/** @type {Multimap<"a" | "b", number>} with type annotation */
|
||||
const map = new Multimap("a", 1);
|
||||
>map : Symbol(map, Decl(propertiesOfGenericConstructorFunctions.js, 14, 5))
|
||||
>Multimap : Symbol(Multimap, Decl(propertiesOfGenericConstructorFunctions.js, 0, 0))
|
||||
|
||||
// without type annotation
|
||||
const map2 = new Multimap("m", 2);
|
||||
>map2 : Symbol(map2, Decl(propertiesOfGenericConstructorFunctions.js, 16, 5))
|
||||
>Multimap : Symbol(Multimap, Decl(propertiesOfGenericConstructorFunctions.js, 0, 0))
|
||||
|
||||
/** @type {number} */
|
||||
var n = map._map['hi']
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>map._map : Symbol(Multimap._map, Decl(propertiesOfGenericConstructorFunctions.js, 6, 27))
|
||||
>map : Symbol(map, Decl(propertiesOfGenericConstructorFunctions.js, 14, 5))
|
||||
>_map : Symbol(Multimap._map, Decl(propertiesOfGenericConstructorFunctions.js, 6, 27))
|
||||
|
||||
/** @type {number} */
|
||||
var n = map._map2['hi']
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>map._map2 : Symbol(Multimap._map2, Decl(propertiesOfGenericConstructorFunctions.js, 8, 19))
|
||||
>map : Symbol(map, Decl(propertiesOfGenericConstructorFunctions.js, 14, 5))
|
||||
>_map2 : Symbol(Multimap._map2, Decl(propertiesOfGenericConstructorFunctions.js, 8, 19))
|
||||
|
||||
/** @type {number} */
|
||||
var n = map2._map['hi']
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>map2._map : Symbol(Multimap._map, Decl(propertiesOfGenericConstructorFunctions.js, 6, 27))
|
||||
>map2 : Symbol(map2, Decl(propertiesOfGenericConstructorFunctions.js, 16, 5))
|
||||
>_map : Symbol(Multimap._map, Decl(propertiesOfGenericConstructorFunctions.js, 6, 27))
|
||||
|
||||
/** @type {number} */
|
||||
var n = map._map2['hi']
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>map._map2 : Symbol(Multimap._map2, Decl(propertiesOfGenericConstructorFunctions.js, 8, 19))
|
||||
>map : Symbol(map, Decl(propertiesOfGenericConstructorFunctions.js, 14, 5))
|
||||
>_map2 : Symbol(Multimap._map2, Decl(propertiesOfGenericConstructorFunctions.js, 8, 19))
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cp(t) {
|
||||
>Cp : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>t : Symbol(t, Decl(propertiesOfGenericConstructorFunctions.js, 32, 12))
|
||||
|
||||
this.x = 1
|
||||
>this.x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
>this : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
|
||||
this.y = t
|
||||
>this.y : Symbol(Cp.y, Decl(propertiesOfGenericConstructorFunctions.js, 33, 14))
|
||||
>this : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>y : Symbol(Cp.y, Decl(propertiesOfGenericConstructorFunctions.js, 33, 14))
|
||||
>t : Symbol(t, Decl(propertiesOfGenericConstructorFunctions.js, 32, 12))
|
||||
}
|
||||
Cp.prototype = {
|
||||
>Cp.prototype : Symbol(Cp.prototype, Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>Cp : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>prototype : Symbol(Cp.prototype, Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
|
||||
m1() { return this.x },
|
||||
>m1 : Symbol(m1, Decl(propertiesOfGenericConstructorFunctions.js, 36, 16))
|
||||
>this.x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
>this : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
|
||||
m2() { this.z = this.x + 1; return this.y }
|
||||
>m2 : Symbol(m2, Decl(propertiesOfGenericConstructorFunctions.js, 37, 27))
|
||||
>this.z : Symbol(z, Decl(propertiesOfGenericConstructorFunctions.js, 38, 10))
|
||||
>this : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>z : Symbol(z, Decl(propertiesOfGenericConstructorFunctions.js, 38, 10))
|
||||
>this.x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
>this : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
>this.y : Symbol(Cp.y, Decl(propertiesOfGenericConstructorFunctions.js, 33, 14))
|
||||
>this : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
>y : Symbol(Cp.y, Decl(propertiesOfGenericConstructorFunctions.js, 33, 14))
|
||||
}
|
||||
var cp = new Cp(1)
|
||||
>cp : Symbol(cp, Decl(propertiesOfGenericConstructorFunctions.js, 40, 3))
|
||||
>Cp : Symbol(Cp, Decl(propertiesOfGenericConstructorFunctions.js, 25, 23), Decl(propertiesOfGenericConstructorFunctions.js, 35, 1))
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.x
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>cp.x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
>cp : Symbol(cp, Decl(propertiesOfGenericConstructorFunctions.js, 40, 3))
|
||||
>x : Symbol(Cp.x, Decl(propertiesOfGenericConstructorFunctions.js, 32, 16))
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.y
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>cp.y : Symbol(Cp.y, Decl(propertiesOfGenericConstructorFunctions.js, 33, 14))
|
||||
>cp : Symbol(cp, Decl(propertiesOfGenericConstructorFunctions.js, 40, 3))
|
||||
>y : Symbol(Cp.y, Decl(propertiesOfGenericConstructorFunctions.js, 33, 14))
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.m1()
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>cp.m1 : Symbol(m1, Decl(propertiesOfGenericConstructorFunctions.js, 36, 16))
|
||||
>cp : Symbol(cp, Decl(propertiesOfGenericConstructorFunctions.js, 40, 3))
|
||||
>m1 : Symbol(m1, Decl(propertiesOfGenericConstructorFunctions.js, 36, 16))
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.m2()
|
||||
>n : Symbol(n, Decl(propertiesOfGenericConstructorFunctions.js, 19, 3), Decl(propertiesOfGenericConstructorFunctions.js, 21, 3), Decl(propertiesOfGenericConstructorFunctions.js, 23, 3), Decl(propertiesOfGenericConstructorFunctions.js, 25, 3), Decl(propertiesOfGenericConstructorFunctions.js, 43, 3) ... and 3 more)
|
||||
>cp.m2 : Symbol(m2, Decl(propertiesOfGenericConstructorFunctions.js, 37, 27))
|
||||
>cp : Symbol(cp, Decl(propertiesOfGenericConstructorFunctions.js, 40, 3))
|
||||
>m2 : Symbol(m2, Decl(propertiesOfGenericConstructorFunctions.js, 37, 27))
|
||||
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
=== tests/cases/conformance/salsa/propertiesOfGenericConstructorFunctions.js ===
|
||||
/**
|
||||
* @template {string} K
|
||||
* @template V
|
||||
* @param {string} ik
|
||||
* @param {V} iv
|
||||
*/
|
||||
function Multimap(ik, iv) {
|
||||
>Multimap : typeof Multimap
|
||||
>ik : string
|
||||
>iv : V
|
||||
|
||||
/** @type {{ [s: string]: V }} */
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : any
|
||||
>this : any
|
||||
>_map : any
|
||||
>{} : {}
|
||||
|
||||
// without type annotation
|
||||
this._map2 = { [ik]: iv };
|
||||
>this._map2 = { [ik]: iv } : { [x: string]: V; }
|
||||
>this._map2 : any
|
||||
>this : any
|
||||
>_map2 : any
|
||||
>{ [ik]: iv } : { [x: string]: V; }
|
||||
>[ik] : V
|
||||
>ik : string
|
||||
>iv : V
|
||||
|
||||
};
|
||||
|
||||
/** @type {Multimap<"a" | "b", number>} with type annotation */
|
||||
const map = new Multimap("a", 1);
|
||||
>map : Multimap<"a" | "b", number>
|
||||
>new Multimap("a", 1) : Multimap<"a" | "b", number>
|
||||
>Multimap : typeof Multimap
|
||||
>"a" : "a"
|
||||
>1 : 1
|
||||
|
||||
// without type annotation
|
||||
const map2 = new Multimap("m", 2);
|
||||
>map2 : Multimap<string, number>
|
||||
>new Multimap("m", 2) : Multimap<string, number>
|
||||
>Multimap : typeof Multimap
|
||||
>"m" : "m"
|
||||
>2 : 2
|
||||
|
||||
/** @type {number} */
|
||||
var n = map._map['hi']
|
||||
>n : number
|
||||
>map._map['hi'] : number
|
||||
>map._map : { [s: string]: number; }
|
||||
>map : Multimap<"a" | "b", number>
|
||||
>_map : { [s: string]: number; }
|
||||
>'hi' : "hi"
|
||||
|
||||
/** @type {number} */
|
||||
var n = map._map2['hi']
|
||||
>n : number
|
||||
>map._map2['hi'] : number
|
||||
>map._map2 : { [x: string]: number; }
|
||||
>map : Multimap<"a" | "b", number>
|
||||
>_map2 : { [x: string]: number; }
|
||||
>'hi' : "hi"
|
||||
|
||||
/** @type {number} */
|
||||
var n = map2._map['hi']
|
||||
>n : number
|
||||
>map2._map['hi'] : number
|
||||
>map2._map : { [s: string]: number; }
|
||||
>map2 : Multimap<string, number>
|
||||
>_map : { [s: string]: number; }
|
||||
>'hi' : "hi"
|
||||
|
||||
/** @type {number} */
|
||||
var n = map._map2['hi']
|
||||
>n : number
|
||||
>map._map2['hi'] : number
|
||||
>map._map2 : { [x: string]: number; }
|
||||
>map : Multimap<"a" | "b", number>
|
||||
>_map2 : { [x: string]: number; }
|
||||
>'hi' : "hi"
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cp(t) {
|
||||
>Cp : typeof Cp
|
||||
>t : T
|
||||
|
||||
this.x = 1
|
||||
>this.x = 1 : 1
|
||||
>this.x : number
|
||||
>this : this
|
||||
>x : number
|
||||
>1 : 1
|
||||
|
||||
this.y = t
|
||||
>this.y = t : T
|
||||
>this.y : T
|
||||
>this : this
|
||||
>y : T
|
||||
>t : T
|
||||
}
|
||||
Cp.prototype = {
|
||||
>Cp.prototype = { m1() { return this.x }, m2() { this.z = this.x + 1; return this.y }} : { m1(): number; m2(): T; }
|
||||
>Cp.prototype : { m1(): number; m2(): T; }
|
||||
>Cp : typeof Cp
|
||||
>prototype : { m1(): number; m2(): T; }
|
||||
>{ m1() { return this.x }, m2() { this.z = this.x + 1; return this.y }} : { m1(): number; m2(): T; }
|
||||
|
||||
m1() { return this.x },
|
||||
>m1 : () => number
|
||||
>this.x : number
|
||||
>this : this
|
||||
>x : number
|
||||
|
||||
m2() { this.z = this.x + 1; return this.y }
|
||||
>m2 : () => T
|
||||
>this.z = this.x + 1 : number
|
||||
>this.z : number
|
||||
>this : this
|
||||
>z : number
|
||||
>this.x + 1 : number
|
||||
>this.x : number
|
||||
>this : this
|
||||
>x : number
|
||||
>1 : 1
|
||||
>this.y : T
|
||||
>this : this
|
||||
>y : T
|
||||
}
|
||||
var cp = new Cp(1)
|
||||
>cp : Cp<number>
|
||||
>new Cp(1) : Cp<number>
|
||||
>Cp : typeof Cp
|
||||
>1 : 1
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.x
|
||||
>n : number
|
||||
>cp.x : number
|
||||
>cp : Cp<number>
|
||||
>x : number
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.y
|
||||
>n : number
|
||||
>cp.y : number
|
||||
>cp : Cp<number>
|
||||
>y : number
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.m1()
|
||||
>n : number
|
||||
>cp.m1() : number
|
||||
>cp.m1 : () => number
|
||||
>cp : Cp<number>
|
||||
>m1 : () => number
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.m2()
|
||||
>n : number
|
||||
>cp.m2() : number
|
||||
>cp.m2 : () => number
|
||||
>cp : Cp<number>
|
||||
>m2 : () => number
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
=== tests/cases/conformance/salsa/prototypePropertyAssignmentMergeAcrossFiles.js ===
|
||||
function C() {
|
||||
>C : Symbol(C, Decl(prototypePropertyAssignmentMergeAcrossFiles.js, 0, 0))
|
||||
|
||||
this.a = 1
|
||||
>a : Symbol(C.a, Decl(prototypePropertyAssignmentMergeAcrossFiles.js, 0, 14))
|
||||
}
|
||||
|
||||
=== tests/cases/conformance/salsa/other.js ===
|
||||
C.prototype.foo = function() { return this.a }
|
||||
>C.prototype : Symbol(Function.prototype, Decl(lib.es5.d.ts, --, --))
|
||||
>C : Symbol(C, Decl(prototypePropertyAssignmentMergeAcrossFiles.js, 0, 0))
|
||||
>prototype : Symbol(Function.prototype, Decl(lib.es5.d.ts, --, --))
|
||||
>this.a : Symbol(C.a, Decl(prototypePropertyAssignmentMergeAcrossFiles.js, 0, 14))
|
||||
>this : Symbol(C, Decl(prototypePropertyAssignmentMergeAcrossFiles.js, 0, 0))
|
||||
>a : Symbol(C.a, Decl(prototypePropertyAssignmentMergeAcrossFiles.js, 0, 14))
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
=== tests/cases/conformance/salsa/prototypePropertyAssignmentMergeAcrossFiles.js ===
|
||||
function C() {
|
||||
>C : typeof C
|
||||
|
||||
this.a = 1
|
||||
>this.a = 1 : 1
|
||||
>this.a : any
|
||||
>this : any
|
||||
>a : any
|
||||
>1 : 1
|
||||
}
|
||||
|
||||
=== tests/cases/conformance/salsa/other.js ===
|
||||
C.prototype.foo = function() { return this.a }
|
||||
>C.prototype.foo = function() { return this.a } : () => number
|
||||
>C.prototype.foo : any
|
||||
>C.prototype : any
|
||||
>C : typeof C
|
||||
>prototype : any
|
||||
>foo : any
|
||||
>function() { return this.a } : () => number
|
||||
>this.a : number
|
||||
>this : this
|
||||
>a : number
|
||||
|
||||
@@ -26,7 +26,7 @@ MyClass.prototype.optionalParam = function(required, notRequired) {
|
||||
>notRequired : string
|
||||
|
||||
return this;
|
||||
>this : MyClass
|
||||
>this : this
|
||||
|
||||
};
|
||||
let pInst = new MyClass();
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
=== tests/cases/conformance/salsa/thisTypeOfConstructorFunctions.js ===
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cp(t) {
|
||||
>Cp : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>t : Symbol(t, Decl(thisTypeOfConstructorFunctions.js, 5, 12))
|
||||
|
||||
/** @type {this} */
|
||||
this.dit = this
|
||||
>this.dit : Symbol(Cp.dit, Decl(thisTypeOfConstructorFunctions.js, 5, 16))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>dit : Symbol(Cp.dit, Decl(thisTypeOfConstructorFunctions.js, 5, 16))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
|
||||
this.y = t
|
||||
>this.y : Symbol(Cp.y, Decl(thisTypeOfConstructorFunctions.js, 7, 19))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>y : Symbol(Cp.y, Decl(thisTypeOfConstructorFunctions.js, 7, 19))
|
||||
>t : Symbol(t, Decl(thisTypeOfConstructorFunctions.js, 5, 12))
|
||||
|
||||
/** @return {this} */
|
||||
this.m3 = () => this
|
||||
>this.m3 : Symbol(Cp.m3, Decl(thisTypeOfConstructorFunctions.js, 8, 14))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>m3 : Symbol(Cp.m3, Decl(thisTypeOfConstructorFunctions.js, 8, 14))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
}
|
||||
|
||||
Cp.prototype = {
|
||||
>Cp.prototype : Symbol(Cp.prototype, Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>Cp : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>prototype : Symbol(Cp.prototype, Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
|
||||
/** @return {this} */
|
||||
m4() {
|
||||
>m4 : Symbol(m4, Decl(thisTypeOfConstructorFunctions.js, 13, 16))
|
||||
|
||||
this.z = this.y; return this
|
||||
>this.z : Symbol(z, Decl(thisTypeOfConstructorFunctions.js, 15, 10))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>z : Symbol(z, Decl(thisTypeOfConstructorFunctions.js, 15, 10))
|
||||
>this.y : Symbol(Cp.y, Decl(thisTypeOfConstructorFunctions.js, 7, 19))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
>y : Symbol(Cp.y, Decl(thisTypeOfConstructorFunctions.js, 7, 19))
|
||||
>this : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cpp(t) {
|
||||
>Cpp : Symbol(Cpp, Decl(thisTypeOfConstructorFunctions.js, 18, 1))
|
||||
>t : Symbol(t, Decl(thisTypeOfConstructorFunctions.js, 25, 13))
|
||||
|
||||
this.y = t
|
||||
>this.y : Symbol(Cpp.y, Decl(thisTypeOfConstructorFunctions.js, 25, 17))
|
||||
>this : Symbol(Cpp, Decl(thisTypeOfConstructorFunctions.js, 18, 1))
|
||||
>y : Symbol(Cpp.y, Decl(thisTypeOfConstructorFunctions.js, 25, 17))
|
||||
>t : Symbol(t, Decl(thisTypeOfConstructorFunctions.js, 25, 13))
|
||||
}
|
||||
/** @return {this} */
|
||||
Cpp.prototype.m2 = function () {
|
||||
>Cpp.prototype : Symbol(Cpp.m2, Decl(thisTypeOfConstructorFunctions.js, 27, 1))
|
||||
>Cpp : Symbol(Cpp, Decl(thisTypeOfConstructorFunctions.js, 18, 1))
|
||||
>prototype : Symbol(Function.prototype, Decl(lib.es5.d.ts, --, --))
|
||||
>m2 : Symbol(Cpp.m2, Decl(thisTypeOfConstructorFunctions.js, 27, 1))
|
||||
|
||||
this.z = this.y; return this
|
||||
>this.z : Symbol(Cpp.z, Decl(thisTypeOfConstructorFunctions.js, 29, 32))
|
||||
>this : Symbol(Cpp, Decl(thisTypeOfConstructorFunctions.js, 18, 1))
|
||||
>z : Symbol(Cpp.z, Decl(thisTypeOfConstructorFunctions.js, 29, 32))
|
||||
>this.y : Symbol(Cpp.y, Decl(thisTypeOfConstructorFunctions.js, 25, 17))
|
||||
>this : Symbol(Cpp, Decl(thisTypeOfConstructorFunctions.js, 18, 1))
|
||||
>y : Symbol(Cpp.y, Decl(thisTypeOfConstructorFunctions.js, 25, 17))
|
||||
>this : Symbol(Cpp, Decl(thisTypeOfConstructorFunctions.js, 18, 1))
|
||||
}
|
||||
|
||||
var cp = new Cp(1)
|
||||
>cp : Symbol(cp, Decl(thisTypeOfConstructorFunctions.js, 33, 3))
|
||||
>Cp : Symbol(Cp, Decl(thisTypeOfConstructorFunctions.js, 0, 0), Decl(thisTypeOfConstructorFunctions.js, 11, 1))
|
||||
|
||||
var cpp = new Cpp(2)
|
||||
>cpp : Symbol(cpp, Decl(thisTypeOfConstructorFunctions.js, 34, 3))
|
||||
>Cpp : Symbol(Cpp, Decl(thisTypeOfConstructorFunctions.js, 18, 1))
|
||||
|
||||
cp.dit
|
||||
>cp.dit : Symbol(Cp.dit, Decl(thisTypeOfConstructorFunctions.js, 5, 16))
|
||||
>cp : Symbol(cp, Decl(thisTypeOfConstructorFunctions.js, 33, 3))
|
||||
>dit : Symbol(Cp.dit, Decl(thisTypeOfConstructorFunctions.js, 5, 16))
|
||||
|
||||
/** @type {Cpp<number>} */
|
||||
var cppn = cpp.m2()
|
||||
>cppn : Symbol(cppn, Decl(thisTypeOfConstructorFunctions.js, 38, 3))
|
||||
>cpp.m2 : Symbol(Cpp.m2, Decl(thisTypeOfConstructorFunctions.js, 27, 1))
|
||||
>cpp : Symbol(cpp, Decl(thisTypeOfConstructorFunctions.js, 34, 3))
|
||||
>m2 : Symbol(Cpp.m2, Decl(thisTypeOfConstructorFunctions.js, 27, 1))
|
||||
|
||||
/** @type {Cp<number>} */
|
||||
var cpn = cp.m3()
|
||||
>cpn : Symbol(cpn, Decl(thisTypeOfConstructorFunctions.js, 41, 3), Decl(thisTypeOfConstructorFunctions.js, 43, 3))
|
||||
>cp.m3 : Symbol(Cp.m3, Decl(thisTypeOfConstructorFunctions.js, 8, 14))
|
||||
>cp : Symbol(cp, Decl(thisTypeOfConstructorFunctions.js, 33, 3))
|
||||
>m3 : Symbol(Cp.m3, Decl(thisTypeOfConstructorFunctions.js, 8, 14))
|
||||
|
||||
/** @type {Cp<number>} */
|
||||
var cpn = cp.m4()
|
||||
>cpn : Symbol(cpn, Decl(thisTypeOfConstructorFunctions.js, 41, 3), Decl(thisTypeOfConstructorFunctions.js, 43, 3))
|
||||
>cp.m4 : Symbol(m4, Decl(thisTypeOfConstructorFunctions.js, 13, 16))
|
||||
>cp : Symbol(cp, Decl(thisTypeOfConstructorFunctions.js, 33, 3))
|
||||
>m4 : Symbol(m4, Decl(thisTypeOfConstructorFunctions.js, 13, 16))
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
=== tests/cases/conformance/salsa/thisTypeOfConstructorFunctions.js ===
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cp(t) {
|
||||
>Cp : typeof Cp
|
||||
>t : T
|
||||
|
||||
/** @type {this} */
|
||||
this.dit = this
|
||||
>this.dit = this : this
|
||||
>this.dit : this
|
||||
>this : this
|
||||
>dit : this
|
||||
>this : this
|
||||
|
||||
this.y = t
|
||||
>this.y = t : T
|
||||
>this.y : T
|
||||
>this : this
|
||||
>y : T
|
||||
>t : T
|
||||
|
||||
/** @return {this} */
|
||||
this.m3 = () => this
|
||||
>this.m3 = () => this : () => this
|
||||
>this.m3 : () => this
|
||||
>this : this
|
||||
>m3 : () => this
|
||||
>() => this : () => this
|
||||
>this : this
|
||||
}
|
||||
|
||||
Cp.prototype = {
|
||||
>Cp.prototype = { /** @return {this} */ m4() { this.z = this.y; return this }} : { m4(): this; }
|
||||
>Cp.prototype : { m4(): this; }
|
||||
>Cp : typeof Cp
|
||||
>prototype : { m4(): this; }
|
||||
>{ /** @return {this} */ m4() { this.z = this.y; return this }} : { m4(): this; }
|
||||
|
||||
/** @return {this} */
|
||||
m4() {
|
||||
>m4 : () => this
|
||||
|
||||
this.z = this.y; return this
|
||||
>this.z = this.y : T
|
||||
>this.z : T
|
||||
>this : this
|
||||
>z : T
|
||||
>this.y : T
|
||||
>this : this
|
||||
>y : T
|
||||
>this : this
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cpp(t) {
|
||||
>Cpp : typeof Cpp
|
||||
>t : T
|
||||
|
||||
this.y = t
|
||||
>this.y = t : T
|
||||
>this.y : T
|
||||
>this : this
|
||||
>y : T
|
||||
>t : T
|
||||
}
|
||||
/** @return {this} */
|
||||
Cpp.prototype.m2 = function () {
|
||||
>Cpp.prototype.m2 = function () { this.z = this.y; return this} : () => this
|
||||
>Cpp.prototype.m2 : any
|
||||
>Cpp.prototype : any
|
||||
>Cpp : typeof Cpp
|
||||
>prototype : any
|
||||
>m2 : any
|
||||
>function () { this.z = this.y; return this} : () => this
|
||||
|
||||
this.z = this.y; return this
|
||||
>this.z = this.y : T
|
||||
>this.z : T
|
||||
>this : this
|
||||
>z : T
|
||||
>this.y : T
|
||||
>this : this
|
||||
>y : T
|
||||
>this : this
|
||||
}
|
||||
|
||||
var cp = new Cp(1)
|
||||
>cp : Cp<number>
|
||||
>new Cp(1) : Cp<number>
|
||||
>Cp : typeof Cp
|
||||
>1 : 1
|
||||
|
||||
var cpp = new Cpp(2)
|
||||
>cpp : Cpp<number>
|
||||
>new Cpp(2) : Cpp<number>
|
||||
>Cpp : typeof Cpp
|
||||
>2 : 2
|
||||
|
||||
cp.dit
|
||||
>cp.dit : Cp<number>
|
||||
>cp : Cp<number>
|
||||
>dit : Cp<number>
|
||||
|
||||
/** @type {Cpp<number>} */
|
||||
var cppn = cpp.m2()
|
||||
>cppn : Cpp<number>
|
||||
>cpp.m2() : Cpp<number>
|
||||
>cpp.m2 : () => Cpp<number>
|
||||
>cpp : Cpp<number>
|
||||
>m2 : () => Cpp<number>
|
||||
|
||||
/** @type {Cp<number>} */
|
||||
var cpn = cp.m3()
|
||||
>cpn : Cp<number>
|
||||
>cp.m3() : Cp<number>
|
||||
>cp.m3 : () => Cp<number>
|
||||
>cp : Cp<number>
|
||||
>m3 : () => Cp<number>
|
||||
|
||||
/** @type {Cp<number>} */
|
||||
var cpn = cp.m4()
|
||||
>cpn : Cp<number>
|
||||
>cp.m4() : Cp<number>
|
||||
>cp.m4 : () => Cp<number>
|
||||
>cp : Cp<number>
|
||||
>m4 : () => Cp<number>
|
||||
|
||||
|
||||
@@ -60,35 +60,35 @@ Installer.prototype.first = function () {
|
||||
this.arg = 'hi' // error
|
||||
>this.arg = 'hi' : "hi"
|
||||
>this.arg : number
|
||||
>this : Installer
|
||||
>this : this
|
||||
>arg : number
|
||||
>'hi' : "hi"
|
||||
|
||||
this.unknown = 'hi' // ok
|
||||
>this.unknown = 'hi' : "hi"
|
||||
>this.unknown : string | boolean | null
|
||||
>this : Installer
|
||||
>this : this
|
||||
>unknown : string | boolean | null
|
||||
>'hi' : "hi"
|
||||
|
||||
this.newProperty = 1 // ok: number | boolean
|
||||
>this.newProperty = 1 : 1
|
||||
>this.newProperty : number | boolean | undefined
|
||||
>this : Installer
|
||||
>this : this
|
||||
>newProperty : number | boolean | undefined
|
||||
>1 : 1
|
||||
|
||||
this.twice = undefined // ok
|
||||
>this.twice = undefined : undefined
|
||||
>this.twice : string | undefined
|
||||
>this : Installer
|
||||
>this : this
|
||||
>twice : string | undefined
|
||||
>undefined : undefined
|
||||
|
||||
this.twice = 'hi' // ok
|
||||
>this.twice = 'hi' : "hi"
|
||||
>this.twice : string | undefined
|
||||
>this : Installer
|
||||
>this : this
|
||||
>twice : string | undefined
|
||||
>'hi' : "hi"
|
||||
}
|
||||
@@ -104,35 +104,35 @@ Installer.prototype.second = function () {
|
||||
this.arg = false // error
|
||||
>this.arg = false : false
|
||||
>this.arg : number
|
||||
>this : Installer
|
||||
>this : this
|
||||
>arg : number
|
||||
>false : false
|
||||
|
||||
this.unknown = false // ok
|
||||
>this.unknown = false : false
|
||||
>this.unknown : string | boolean | null
|
||||
>this : Installer
|
||||
>this : this
|
||||
>unknown : string | boolean | null
|
||||
>false : false
|
||||
|
||||
this.newProperty = false // ok
|
||||
>this.newProperty = false : false
|
||||
>this.newProperty : number | boolean | undefined
|
||||
>this : Installer
|
||||
>this : this
|
||||
>newProperty : number | boolean | undefined
|
||||
>false : false
|
||||
|
||||
this.twice = null // error
|
||||
>this.twice = null : null
|
||||
>this.twice : string | undefined
|
||||
>this : Installer
|
||||
>this : this
|
||||
>twice : string | undefined
|
||||
>null : null
|
||||
|
||||
this.twice = false // error
|
||||
>this.twice = false : false
|
||||
>this.twice : string | undefined
|
||||
>this : Installer
|
||||
>this : this
|
||||
>twice : string | undefined
|
||||
>false : false
|
||||
|
||||
@@ -140,7 +140,7 @@ Installer.prototype.second = function () {
|
||||
>this.twices.push(1) : number
|
||||
>this.twices.push : (...items: any[]) => number
|
||||
>this.twices : any[] | null
|
||||
>this : Installer
|
||||
>this : this
|
||||
>twices : any[] | null
|
||||
>push : (...items: any[]) => number
|
||||
>1 : 1
|
||||
@@ -148,7 +148,7 @@ Installer.prototype.second = function () {
|
||||
if (this.twices != null) {
|
||||
>this.twices != null : boolean
|
||||
>this.twices : any[] | null
|
||||
>this : Installer
|
||||
>this : this
|
||||
>twices : any[] | null
|
||||
>null : null
|
||||
|
||||
@@ -156,7 +156,7 @@ Installer.prototype.second = function () {
|
||||
>this.twices.push('hi') : number
|
||||
>this.twices.push : (...items: any[]) => number
|
||||
>this.twices : any[]
|
||||
>this : Installer
|
||||
>this : this
|
||||
>twices : any[]
|
||||
>push : (...items: any[]) => number
|
||||
>'hi' : "hi"
|
||||
|
||||
@@ -36,28 +36,28 @@ Inner.prototype.k;
|
||||
>k : any
|
||||
|
||||
var inner = new Inner()
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>new Inner() : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>new Inner() : Inner
|
||||
>Inner : typeof Inner
|
||||
|
||||
inner.m()
|
||||
>inner.m() : void
|
||||
>inner.m : () => void
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>m : () => void
|
||||
|
||||
inner.i
|
||||
>inner.i : number
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>i : number
|
||||
|
||||
inner.j
|
||||
>inner.j : number
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>j : number
|
||||
|
||||
inner.k
|
||||
>inner.k : string
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>k : string
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
=== tests/cases/conformance/salsa/module.js ===
|
||||
var Outer = function(element, config) {};
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): Pos; }
|
||||
>function(element, config) {} : { (element: any, config: any): void; Pos(line: any, ch: any): Pos; }
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): void; }
|
||||
>function(element, config) {} : { (element: any, config: any): void; Pos(line: any, ch: any): void; }
|
||||
>element : any
|
||||
>config : any
|
||||
|
||||
@@ -10,7 +10,7 @@ var Outer = function(element, config) {};
|
||||
Outer.Pos = function (line, ch) {};
|
||||
>Outer.Pos = function (line, ch) {} : typeof Pos
|
||||
>Outer.Pos : typeof Pos
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): Pos; }
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): void; }
|
||||
>Pos : typeof Pos
|
||||
>function (line, ch) {} : typeof Pos
|
||||
>line : any
|
||||
@@ -21,7 +21,7 @@ Outer.Pos.prototype.line;
|
||||
>Outer.Pos.prototype.line : any
|
||||
>Outer.Pos.prototype : any
|
||||
>Outer.Pos : typeof Pos
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): Pos; }
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): void; }
|
||||
>Pos : typeof Pos
|
||||
>prototype : any
|
||||
>line : any
|
||||
@@ -30,7 +30,7 @@ var pos = new Outer.Pos(1, 'x');
|
||||
>pos : Pos
|
||||
>new Outer.Pos(1, 'x') : Pos
|
||||
>Outer.Pos : typeof Pos
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): Pos; }
|
||||
>Outer : { (element: any, config: any): void; Pos(line: any, ch: any): void; }
|
||||
>Pos : typeof Pos
|
||||
>1 : 1
|
||||
>'x' : "x"
|
||||
|
||||
@@ -49,8 +49,8 @@ Outer.Inner.prototype.k;
|
||||
>k : any
|
||||
|
||||
var inner = new Outer.Inner()
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>new Outer.Inner() : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>new Outer.Inner() : Inner
|
||||
>Outer.Inner : typeof Inner
|
||||
>Outer : typeof Outer
|
||||
>Inner : typeof Inner
|
||||
@@ -58,21 +58,21 @@ var inner = new Outer.Inner()
|
||||
inner.m()
|
||||
>inner.m() : void
|
||||
>inner.m : () => void
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>m : () => void
|
||||
|
||||
inner.i
|
||||
>inner.i : number
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>i : number
|
||||
|
||||
inner.j
|
||||
>inner.j : number
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>j : number
|
||||
|
||||
inner.k
|
||||
>inner.k : string
|
||||
>inner : Inner & { m(): void; i: number; }
|
||||
>inner : Inner
|
||||
>k : string
|
||||
|
||||
|
||||
@@ -31,35 +31,35 @@ Outer.Inner.prototype = {
|
||||
=== tests/cases/conformance/salsa/use.js ===
|
||||
/** @type {Outer.Inner} */
|
||||
var inner
|
||||
>inner : { x: number; m(): void; }
|
||||
>inner : Inner
|
||||
|
||||
inner.x
|
||||
>inner.x : number
|
||||
>inner : { x: number; m(): void; }
|
||||
>inner : Inner
|
||||
>x : number
|
||||
|
||||
inner.m()
|
||||
>inner.m() : void
|
||||
>inner.m : () => void
|
||||
>inner : { x: number; m(): void; }
|
||||
>inner : Inner
|
||||
>m : () => void
|
||||
|
||||
var inno = new Outer.Inner()
|
||||
>inno : { x: number; m(): void; }
|
||||
>new Outer.Inner() : { x: number; m(): void; }
|
||||
>inno : Inner
|
||||
>new Outer.Inner() : Inner
|
||||
>Outer.Inner : typeof Inner
|
||||
>Outer : typeof Outer
|
||||
>Inner : typeof Inner
|
||||
|
||||
inno.x
|
||||
>inno.x : number
|
||||
>inno : { x: number; m(): void; }
|
||||
>inno : Inner
|
||||
>x : number
|
||||
|
||||
inno.m()
|
||||
>inno.m() : void
|
||||
>inno.m : () => void
|
||||
>inno : { x: number; m(): void; }
|
||||
>inno : Inner
|
||||
>m : () => void
|
||||
|
||||
|
||||
|
||||
@@ -29,34 +29,34 @@ Outer.Inner.prototype = {
|
||||
|
||||
/** @type {Outer.Inner} */
|
||||
var inner
|
||||
>inner : { x: number; m(): void; }
|
||||
>inner : Inner
|
||||
|
||||
inner.x
|
||||
>inner.x : number
|
||||
>inner : { x: number; m(): void; }
|
||||
>inner : Inner
|
||||
>x : number
|
||||
|
||||
inner.m()
|
||||
>inner.m() : void
|
||||
>inner.m : () => void
|
||||
>inner : { x: number; m(): void; }
|
||||
>inner : Inner
|
||||
>m : () => void
|
||||
|
||||
var inno = new Outer.Inner()
|
||||
>inno : { x: number; m(): void; }
|
||||
>new Outer.Inner() : { x: number; m(): void; }
|
||||
>inno : Inner
|
||||
>new Outer.Inner() : Inner
|
||||
>Outer.Inner : typeof Inner
|
||||
>Outer : typeof Outer
|
||||
>Inner : typeof Inner
|
||||
|
||||
inno.x
|
||||
>inno.x : number
|
||||
>inno : { x: number; m(): void; }
|
||||
>inno : Inner
|
||||
>x : number
|
||||
|
||||
inno.m()
|
||||
>inno.m() : void
|
||||
>inno.m : () => void
|
||||
>inno : { x: number; m(): void; }
|
||||
>inno : Inner
|
||||
>m : () => void
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
this._trampolineEnabled = false;
|
||||
>this._trampolineEnabled = false : false
|
||||
>this._trampolineEnabled : boolean
|
||||
>this : Async
|
||||
>this : this
|
||||
>_trampolineEnabled : boolean
|
||||
>false : false
|
||||
}
|
||||
|
||||
@@ -27,14 +27,14 @@ Installer.prototype.loadArgMetadata = function (next) {
|
||||
this.args = 'hi'
|
||||
>this.args = 'hi' : "hi"
|
||||
>this.args : number
|
||||
>this : Installer
|
||||
>this : this
|
||||
>args : number
|
||||
>'hi' : "hi"
|
||||
|
||||
this.newProperty = 1
|
||||
>this.newProperty = 1 : 1
|
||||
>this.newProperty : number | undefined
|
||||
>this : Installer
|
||||
>this : this
|
||||
>newProperty : number | undefined
|
||||
>1 : 1
|
||||
}
|
||||
|
||||
@@ -18,17 +18,17 @@ C.prototype = { q: 2 };
|
||||
>2 : 2
|
||||
|
||||
const c = new C()
|
||||
>c : C & { q: number; }
|
||||
>new C() : C & { q: number; }
|
||||
>c : C
|
||||
>new C() : C
|
||||
>C : typeof C
|
||||
|
||||
c.p
|
||||
>c.p : number
|
||||
>c : C & { q: number; }
|
||||
>c : C
|
||||
>p : number
|
||||
|
||||
c.q
|
||||
>c.q : number
|
||||
>c : C & { q: number; }
|
||||
>c : C
|
||||
>q : number
|
||||
|
||||
|
||||
@@ -7,22 +7,27 @@ var Multimap = function() {
|
||||
|
||||
this._map = {};
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 11, 22))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>set : Symbol(set, Decl(a.js, 11, 22))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 17, 6))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>get : Symbol(get, Decl(a.js, 17, 6))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
|
||||
};
|
||||
@@ -37,18 +42,22 @@ Multimap.prototype = {
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 11, 22))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>set : Symbol(set, Decl(a.js, 11, 22))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 17, 6))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>get : Symbol(get, Decl(a.js, 17, 6))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
|
||||
},
|
||||
@@ -57,18 +66,22 @@ Multimap.prototype = {
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 11, 22))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>set : Symbol(set, Decl(a.js, 11, 22))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 17, 6))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>get : Symbol(get, Decl(a.js, 17, 6))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
}
|
||||
}
|
||||
@@ -81,18 +94,22 @@ Multimap.prototype.addon = function () {
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 3, 27))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 11, 22))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>set : Symbol(set, Decl(a.js, 11, 22))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 17, 6))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>get : Symbol(get, Decl(a.js, 17, 6))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
>this : Symbol(Multimap, Decl(a.js, 3, 14))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 24, 1))
|
||||
}
|
||||
|
||||
|
||||
@@ -9,28 +9,28 @@ var Multimap = function() {
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
>{} : {}
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
|
||||
};
|
||||
@@ -48,22 +48,22 @@ Multimap.prototype = {
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
|
||||
},
|
||||
@@ -72,22 +72,22 @@ Multimap.prototype = {
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
}
|
||||
}
|
||||
@@ -103,47 +103,47 @@ Multimap.prototype.addon = function () {
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
}
|
||||
|
||||
var mm = new Multimap();
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>new Multimap() : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>new Multimap() : Multimap
|
||||
>Multimap : typeof Multimap
|
||||
|
||||
mm._map
|
||||
>mm._map : {}
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>_map : {}
|
||||
|
||||
mm.set
|
||||
>mm.set : () => void
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>set : () => void
|
||||
|
||||
mm.get
|
||||
>mm.get : () => void
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>get : () => void
|
||||
|
||||
mm.addon
|
||||
>mm.addon : () => void
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>addon : () => void
|
||||
|
||||
|
||||
@@ -10,22 +10,27 @@
|
||||
|
||||
this._map = {};
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 12, 26))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>set : Symbol(set, Decl(a.js, 12, 26))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 18, 10))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>get : Symbol(get, Decl(a.js, 18, 10))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
|
||||
};
|
||||
@@ -40,18 +45,22 @@
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 12, 26))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>set : Symbol(set, Decl(a.js, 12, 26))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 18, 10))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>get : Symbol(get, Decl(a.js, 18, 10))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
|
||||
},
|
||||
@@ -60,18 +69,22 @@
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 12, 26))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>set : Symbol(set, Decl(a.js, 12, 26))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 18, 10))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>get : Symbol(get, Decl(a.js, 18, 10))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
}
|
||||
}
|
||||
@@ -84,18 +97,22 @@
|
||||
|
||||
this._map
|
||||
>this._map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>_map : Symbol(Multimap._map, Decl(a.js, 4, 31))
|
||||
|
||||
this.set
|
||||
>this.set : Symbol(set, Decl(a.js, 12, 26))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>set : Symbol(set, Decl(a.js, 12, 26))
|
||||
|
||||
this.get
|
||||
>this.get : Symbol(get, Decl(a.js, 18, 10))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>get : Symbol(get, Decl(a.js, 18, 10))
|
||||
|
||||
this.addon
|
||||
>this.addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
>this : Symbol(Multimap, Decl(a.js, 4, 18))
|
||||
>addon : Symbol(Multimap.addon, Decl(a.js, 25, 5))
|
||||
}
|
||||
|
||||
|
||||
@@ -14,28 +14,28 @@
|
||||
this._map = {};
|
||||
>this._map = {} : {}
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
>{} : {}
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
|
||||
};
|
||||
@@ -53,22 +53,22 @@
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
|
||||
},
|
||||
@@ -77,22 +77,22 @@
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
}
|
||||
}
|
||||
@@ -108,48 +108,48 @@
|
||||
|
||||
this._map
|
||||
>this._map : {}
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
|
||||
this.set
|
||||
>this.set : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>set : () => void
|
||||
|
||||
this.get
|
||||
>this.get : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>get : () => void
|
||||
|
||||
this.addon
|
||||
>this.addon : () => void
|
||||
>this : Multimap & { set: () => void; get(): void; }
|
||||
>this : this
|
||||
>addon : () => void
|
||||
}
|
||||
|
||||
var mm = new Multimap();
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>new Multimap() : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>new Multimap() : Multimap
|
||||
>Multimap : typeof Multimap
|
||||
|
||||
mm._map
|
||||
>mm._map : {}
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>_map : {}
|
||||
|
||||
mm.set
|
||||
>mm.set : () => void
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>set : () => void
|
||||
|
||||
mm.get
|
||||
>mm.get : () => void
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>get : () => void
|
||||
|
||||
mm.addon
|
||||
>mm.addon : () => void
|
||||
>mm : Multimap & { set: () => void; get(): void; }
|
||||
>mm : Multimap
|
||||
>addon : () => void
|
||||
|
||||
});
|
||||
|
||||
@@ -22,6 +22,7 @@ Multimap3.prototype = {
|
||||
|
||||
return this._map[key + ''];
|
||||
>this._map : Symbol(Multimap3._map, Decl(bug26885.js, 0, 22))
|
||||
>this : Symbol(Multimap3, Decl(bug26885.js, 0, 0), Decl(bug26885.js, 2, 2))
|
||||
>_map : Symbol(Multimap3._map, Decl(bug26885.js, 0, 22))
|
||||
>key : Symbol(key, Decl(bug26885.js, 9, 8))
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ Multimap3.prototype = {
|
||||
return this._map[key + ''];
|
||||
>this._map[key + ''] : any
|
||||
>this._map : {}
|
||||
>this : Multimap3 & { get(key: string): number; }
|
||||
>this : this
|
||||
>_map : {}
|
||||
>key + '' : string
|
||||
>key : string
|
||||
@@ -39,15 +39,15 @@ Multimap3.prototype = {
|
||||
|
||||
/** @type {Multimap3} */
|
||||
const map = new Multimap3();
|
||||
>map : Multimap3 & { get(key: string): number; }
|
||||
>new Multimap3() : Multimap3 & { get(key: string): number; }
|
||||
>map : Multimap3
|
||||
>new Multimap3() : Multimap3
|
||||
>Multimap3 : typeof Multimap3
|
||||
|
||||
const n = map.get('hi')
|
||||
>n : number
|
||||
>map.get('hi') : number
|
||||
>map.get : (key: string) => number
|
||||
>map : Multimap3 & { get(key: string): number; }
|
||||
>map : Multimap3
|
||||
>get : (key: string) => number
|
||||
>'hi' : "hi"
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
/// <reference path="math2d-augment.d.ts" />
|
||||
let v = new Math2d.Vector(3, 2);
|
||||
>v : Symbol(v, Decl(a.ts, 2, 3))
|
||||
>Math2d.Vector : Symbol(Math2d.Vector, Decl(index.d.ts, 5, 1))
|
||||
>Math2d.Vector : Symbol(Vector, Decl(index.d.ts, 5, 1), Decl(math2d-augment.d.ts, 2, 25))
|
||||
>Math2d : Symbol(Math2d, Decl(index.d.ts, 0, 0))
|
||||
>Vector : Symbol(Math2d.Vector, Decl(index.d.ts, 5, 1))
|
||||
>Vector : Symbol(Vector, Decl(index.d.ts, 5, 1), Decl(math2d-augment.d.ts, 2, 25))
|
||||
|
||||
let magnitude = Math2d.getLength(v);
|
||||
>magnitude : Symbol(magnitude, Decl(a.ts, 3, 3))
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
let v = new Math2d.Vector(3, 2);
|
||||
>v : import("tests/cases/conformance/externalModules/node_modules/math2d/index").Vector
|
||||
>new Math2d.Vector(3, 2) : import("tests/cases/conformance/externalModules/node_modules/math2d/index").Vector
|
||||
>Math2d.Vector : typeof Math2d.Vector
|
||||
>Math2d.Vector : typeof import("tests/cases/conformance/externalModules/node_modules/math2d/index").Vector
|
||||
>Math2d : typeof Math2d
|
||||
>Vector : typeof Math2d.Vector
|
||||
>Vector : typeof import("tests/cases/conformance/externalModules/node_modules/math2d/index").Vector
|
||||
>3 : 3
|
||||
>2 : 2
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ Zet.prototype.add = function(v, o) {
|
||||
var z = new Zet(1)
|
||||
z.t = 2
|
||||
z.u = false
|
||||
/** @type {number} */
|
||||
let answer = z.add(3, { nested: 4 })
|
||||
|
||||
// lookup in typedef should not crash the compiler, even when the type is unknown
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
// @Filename: propertiesOfGenericConstructorFunctions.js
|
||||
// @allowJs: true
|
||||
// @checkJs: true
|
||||
// @noEmit: true
|
||||
|
||||
/**
|
||||
* @template {string} K
|
||||
* @template V
|
||||
* @param {string} ik
|
||||
* @param {V} iv
|
||||
*/
|
||||
function Multimap(ik, iv) {
|
||||
/** @type {{ [s: string]: V }} */
|
||||
this._map = {};
|
||||
// without type annotation
|
||||
this._map2 = { [ik]: iv };
|
||||
};
|
||||
|
||||
/** @type {Multimap<"a" | "b", number>} with type annotation */
|
||||
const map = new Multimap("a", 1);
|
||||
// without type annotation
|
||||
const map2 = new Multimap("m", 2);
|
||||
|
||||
/** @type {number} */
|
||||
var n = map._map['hi']
|
||||
/** @type {number} */
|
||||
var n = map._map2['hi']
|
||||
/** @type {number} */
|
||||
var n = map2._map['hi']
|
||||
/** @type {number} */
|
||||
var n = map._map2['hi']
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cp(t) {
|
||||
this.x = 1
|
||||
this.y = t
|
||||
}
|
||||
Cp.prototype = {
|
||||
m1() { return this.x },
|
||||
m2() { this.z = this.x + 1; return this.y }
|
||||
}
|
||||
var cp = new Cp(1)
|
||||
|
||||
/** @type {number} */
|
||||
var n = cp.x
|
||||
/** @type {number} */
|
||||
var n = cp.y
|
||||
/** @type {number} */
|
||||
var n = cp.m1()
|
||||
/** @type {number} */
|
||||
var n = cp.m2()
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
// @Filename: prototypePropertyAssignmentMergeAcrossFiles.js
|
||||
// @allowJs: true
|
||||
// @checkJs: true
|
||||
// @noEmit: true
|
||||
function C() {
|
||||
this.a = 1
|
||||
}
|
||||
|
||||
// @Filename: other.js
|
||||
C.prototype.foo = function() { return this.a }
|
||||
@@ -0,0 +1,50 @@
|
||||
// @Filename: thisTypeOfConstructorFunctions.js
|
||||
// @allowJs: true
|
||||
// @checkJs: true
|
||||
// @noEmit: true
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cp(t) {
|
||||
/** @type {this} */
|
||||
this.dit = this
|
||||
this.y = t
|
||||
/** @return {this} */
|
||||
this.m3 = () => this
|
||||
}
|
||||
|
||||
Cp.prototype = {
|
||||
/** @return {this} */
|
||||
m4() {
|
||||
this.z = this.y; return this
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @template T
|
||||
* @param {T} t
|
||||
*/
|
||||
function Cpp(t) {
|
||||
this.y = t
|
||||
}
|
||||
/** @return {this} */
|
||||
Cpp.prototype.m2 = function () {
|
||||
this.z = this.y; return this
|
||||
}
|
||||
|
||||
var cp = new Cp(1)
|
||||
var cpp = new Cpp(2)
|
||||
cp.dit
|
||||
|
||||
/** @type {Cpp<number>} */
|
||||
var cppn = cpp.m2()
|
||||
|
||||
/** @type {Cp<number>} */
|
||||
var cpn = cp.m3()
|
||||
/** @type {Cp<number>} */
|
||||
var cpn = cp.m4()
|
||||
|
||||
@@ -14,4 +14,4 @@
|
||||
////}
|
||||
////var p = new Pers/**/on();
|
||||
goTo.marker();
|
||||
verify.quickInfoIs("function Person(name: string, age: number): Person", "Represents a person\na b multiline test");
|
||||
verify.quickInfoIs("constructor Person(name: string, age: number): Person", "Represents a person\na b multiline test");
|
||||
|
||||
Reference in New Issue
Block a user