diff --git a/types/webidl2/index.d.ts b/types/webidl2/index.d.ts index ff74059675..013bae8cf2 100644 --- a/types/webidl2/index.d.ts +++ b/types/webidl2/index.d.ts @@ -29,11 +29,7 @@ export type IDLInterfaceMemberType = | DeclarationMemberType | OperationMemberType; -export type IDLInterfaceMixinMemberType = - | AttributeMemberType - | ConstantMemberType - | (DeclarationMemberType & { type: "stringifier" }) - | OperationMemberType; +export type IDLInterfaceMixinMemberType = AttributeMemberType | ConstantMemberType | OperationMemberType; export type IDLNamespaceMemberType = AttributeMemberType | OperationMemberType; diff --git a/types/webidl2/webidl2-tests.ts b/types/webidl2/webidl2-tests.ts index 75ce356c4f..b13be46ed5 100644 --- a/types/webidl2/webidl2-tests.ts +++ b/types/webidl2/webidl2-tests.ts @@ -13,30 +13,35 @@ for (const rootType of parsed) { switch (rootType.type) { case "interface mixin": rootType; // $ExpectType InterfaceMixinType - logMembers(rootType.members); console.log(rootType.partial); + logInterfaceMixinMembers(rootType.members); break; + case "interface": rootType; // $ExpectType InterfaceType console.log(rootType.inheritance); - logMembers(rootType.members); console.log(rootType.partial); + logInterfaceMembers(rootType.members); break; + case "namespace": rootType; // $ExpectType NamespaceType console.log(rootType.partial); logNamespaceMembers(rootType.members); break; + case "callback interface": rootType; // $ExpectType CallbackInterfaceType console.log(rootType.inheritance); - logMembers(rootType.members); console.log(rootType.partial); + logCallbackInterfaceMembers(rootType.members); break; + case "callback": rootType; // $ExpectType CallbackType logArguments(rootType.arguments); break; + case "dictionary": rootType; // $ExpectType DictionaryType console.log(rootType.inheritance); @@ -49,6 +54,7 @@ for (const rootType of parsed) { } } break; + case "enum": rootType; // $ExpectType EnumType for (const v of rootType.values) { @@ -56,15 +62,18 @@ for (const rootType of parsed) { console.log(v.value); } break; + case "typedef": rootType; // $ExpectType TypedefType logIdlType(rootType.idlType); break; + case "includes": rootType; // $ExpectType IncludesType console.log(rootType.target); console.log(rootType.includes); break; + default: rootType; // $ExpectType never break; @@ -74,73 +83,145 @@ for (const rootType of parsed) { logExtAttrs(rootType.extAttrs); } -function logMembers(members: webidl2.IDLInterfaceMemberType[]) { +function logInterfaceMembers(members: webidl2.IDLInterfaceMemberType[]) { for (const member of members) { - switch (member.type) { - case "constructor": - member; // $ExpectType ConstructorMemberType - member.parent; // $ExpectType InterfaceType - logArguments(member.arguments); - break; - case "operation": - member; // $ExpectType OperationMemberType - member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType | NamespaceType - logNamespaceMember(member); - break; - case "attribute": - member; // $ExpectType AttributeMemberType - member.parent; // $ExpectType InterfaceMixinType | InterfaceType | NamespaceType - logNamespaceMember(member); - break; - case "const": - member; // $ExpectType ConstantMemberType - member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType - console.log(member.name); - logIdlType(member.idlType); - logValueDescription(member.value); - console.log(member.nullable); - break; - case "iterable": - member; // $ExpectType IterableDeclarationMemberType - member.parent; // $ExpectType InterfaceMixinType | InterfaceType - member.async; // $ExpectType boolean - member.readonly; // $ExpectType false - member.idlType; // $ExpectType [IDLTypeDescription] | [IDLTypeDescription, IDLTypeDescription] - member.idlType.forEach(logIdlType); - member.arguments; // $ExpectType Argument[] - logArguments(member.arguments); - break; - case "maplike": - member; // $ExpectType MaplikeDeclarationMemberType - member.parent; // $ExpectType InterfaceMixinType | InterfaceType - member.async; // $ExpectType false - member.readonly; // $ExpectType boolean - member.idlType; // $ExpectType [IDLTypeDescription, IDLTypeDescription] - member.idlType.forEach(logIdlType); - member.arguments; // $ExpectType [] - logArguments(member.arguments); - break; - case "setlike": - member; // $ExpectType SetlikeDeclarationMemberType - member.parent; // $ExpectType InterfaceMixinType | InterfaceType - member.async; // $ExpectType false - member.readonly; // $ExpectType boolean - member.idlType; // $ExpectType [IDLTypeDescription] - member.idlType.forEach(logIdlType); - member.arguments; // $ExpectType [] - logArguments(member.arguments); - break; - default: - member; // $ExpectType never - break; - } + logInterfaceMember(member); logExtAttrs(member.extAttrs); } } +function logInterfaceMember(member: webidl2.IDLInterfaceMemberType) { + switch (member.type) { + case "constructor": + member; // $ExpectType ConstructorMemberType + member.parent; // $ExpectType InterfaceType + logArguments(member.arguments); + break; + + case "operation": + member; // $ExpectType OperationMemberType + member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType | NamespaceType + logInterfaceMixinMember(member); + break; + + case "attribute": + member; // $ExpectType AttributeMemberType + member.parent; // $ExpectType InterfaceMixinType | InterfaceType | NamespaceType + logInterfaceMixinMember(member); + break; + + case "const": + member; // $ExpectType ConstantMemberType + member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType + logInterfaceMixinMember(member); + break; + + case "iterable": + member; // $ExpectType IterableDeclarationMemberType + member.parent; // $ExpectType InterfaceMixinType | InterfaceType + member.async; // $ExpectType boolean + member.readonly; // $ExpectType false + member.idlType; // $ExpectType [IDLTypeDescription] | [IDLTypeDescription, IDLTypeDescription] + member.idlType.forEach(logIdlType); + member.arguments; // $ExpectType Argument[] + logArguments(member.arguments); + break; + + case "maplike": + member; // $ExpectType MaplikeDeclarationMemberType + member.parent; // $ExpectType InterfaceMixinType | InterfaceType + member.async; // $ExpectType false + member.readonly; // $ExpectType boolean + member.idlType; // $ExpectType [IDLTypeDescription, IDLTypeDescription] + member.idlType.forEach(logIdlType); + member.arguments; // $ExpectType [] + logArguments(member.arguments); + break; + + case "setlike": + member; // $ExpectType SetlikeDeclarationMemberType + member.parent; // $ExpectType InterfaceMixinType | InterfaceType + member.async; // $ExpectType false + member.readonly; // $ExpectType boolean + member.idlType; // $ExpectType [IDLTypeDescription] + member.idlType.forEach(logIdlType); + member.arguments; // $ExpectType [] + logArguments(member.arguments); + break; + + default: + member; // $ExpectType never + break; + } +} + +function logInterfaceMixinMembers(members: webidl2.IDLInterfaceMixinMemberType[]) { + for (const member of members) { + logInterfaceMixinMember(member); + logExtAttrs(member.extAttrs); + } +} + +function logInterfaceMixinMember(member: webidl2.IDLInterfaceMixinMemberType) { + switch (member.type) { + case "operation": + member; // $ExpectType OperationMemberType + member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType | NamespaceType + logCallbackInterfaceMember(member); + break; + + case "attribute": + member; // $ExpectType AttributeMemberType + member.parent; // $ExpectType InterfaceMixinType | InterfaceType | NamespaceType + logNamespaceMember(member); + break; + + case "const": + member; // $ExpectType ConstantMemberType + member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType + logCallbackInterfaceMember(member); + break; + + default: + member; // $ExpectType never + break; + } +} + +function logCallbackInterfaceMembers(members: webidl2.IDLCallbackInterfaceMemberType[]) { + for (const member of members) { + logCallbackInterfaceMember(member); + logExtAttrs(member.extAttrs); + } +} + +function logCallbackInterfaceMember(member: webidl2.IDLCallbackInterfaceMemberType) { + switch (member.type) { + case "operation": + member; // $ExpectType OperationMemberType + member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType | NamespaceType + logNamespaceMember(member); + break; + + case "const": + member; // $ExpectType ConstantMemberType + member.parent; // $ExpectType CallbackInterfaceType | InterfaceMixinType | InterfaceType + console.log(member.name); + logIdlType(member.idlType); + logValueDescription(member.value); + console.log(member.nullable); + break; + + default: + member; // $ExpectType never + break; + } +} + function logNamespaceMembers(members: webidl2.IDLNamespaceMemberType[]) { for (const member of members) { logNamespaceMember(member); + logExtAttrs(member.extAttrs); } } @@ -153,12 +234,14 @@ function logNamespaceMember(member: webidl2.IDLNamespaceMemberType) { console.log(member.name); console.log(member.special); break; + case "attribute": member; // $ExpectType AttributeMemberType member.parent; // $ExpectType InterfaceMixinType | InterfaceType | NamespaceType console.log(member.name); console.log(member.special, member.readonly, member.inherit); break; + default: member; // $ExpectType never break; @@ -184,12 +267,14 @@ function logExtAttr(extAttr: webidl2.ExtendedAttribute) { rhs.value; // $ExpectType string logExtAttrRHS(rhs); break; + case "identifier-list": case "string-list": case "decimal-list": case "integer-list": logExtAttrRHSList(rhs); break; + default: rhs; // $ExpectType never break; @@ -245,6 +330,10 @@ function logIdlType(idlType: webidl2.IDLTypeDescription) { case "record": idlType.idlType.length; // $ExpectType 2 break; + + default: + idlType; // $ExpectType never + break; } } else { idlType; // $ExpectType SingleTypeDescription @@ -262,36 +351,44 @@ function logValueDescription(valueDesc: webidl2.ValueDescription) { valueDesc.value; // $ExpectType string console.log(valueDesc.value); break; + case "number": valueDesc; // $ExpectType ValueDescriptionNumber valueDesc.value; // $ExpectType string console.log(valueDesc.value); break; + case "boolean": valueDesc; // $ExpectType ValueDescriptionBoolean valueDesc.value; // $ExpectType boolean console.log(valueDesc.value); break; + case "null": valueDesc; // $ExpectType ValueDescriptionNull break; + case "Infinity": valueDesc; // $ExpectType ValueDescriptionInfinity valueDesc.negative; // $ExpectType boolean console.log(valueDesc.negative); break; + case "NaN": valueDesc; // $ExpectType ValueDescriptionNaN break; + case "sequence": valueDesc; // $ExpectType ValueDescriptionSequence valueDesc.value; // $ExpectType [] valueDesc.value.length; // $ExpectType 0 console.log(valueDesc.value); break; + case "dictionary": valueDesc; // $ExpectType ValueDescriptionDictionary break; + default: valueDesc; // $ExpectType never break;