From db5b0986c4f692bae4ae86b5fd55c6cb357721c1 Mon Sep 17 00:00:00 2001 From: Jaco Date: Mon, 24 Jan 2022 07:46:35 +0100 Subject: [PATCH] Align Range/RangeInclusive handling with other definitions (#4489) * Align Range/RangeInclusive handling with other definitions * Split RangeInclusive class * Rnage -> Range TypeDef * Correct Range wrappers * CHANGELOG * Remove extra Range CHANGELOG entry * Update CHANGELOG.md --- CHANGELOG.md | 8 ++++++ packages/typegen/src/generate/tsDef.ts | 1 + packages/typegen/src/util/formatting.ts | 4 +++ packages/types-codec/src/extended/Range.ts | 14 ---------- .../src/extended/RangeInclusive.ts | 20 ++++++++++++++ packages/types-codec/src/extended/index.ts | 3 ++- packages/types-create/src/create/class.ts | 5 +++- packages/types-create/src/types/types.ts | 1 + packages/types-create/src/util/encodeTypes.ts | 27 ++++++++++++++++++- packages/types-create/src/util/getTypeDef.ts | 13 ++------- .../PortableRegistry/PortableRegistry.ts | 4 ++- 11 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 packages/types-codec/src/extended/RangeInclusive.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 77376d8a32..62e2973e76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # CHANGELOG +## master + +Changes: + +- Dedupe and extend `WrapperKeepOpaque/WrapperOpaque` +- Align `Range/RangeInclusive` usage with similar types + + ## 7.5.1 Jan 23, 2022 Upgrade priority: Low. Recommended for users of the latest contract pallet and ink! versions. diff --git a/packages/typegen/src/generate/tsDef.ts b/packages/typegen/src/generate/tsDef.ts index 54fde182c2..ba3689ee85 100644 --- a/packages/typegen/src/generate/tsDef.ts +++ b/packages/typegen/src/generate/tsDef.ts @@ -235,6 +235,7 @@ export const typeEncoders: Record, imports: TypeImports, withShortcut: boolean) => { + throw new Error(`TypeDefInfo.RangeInclusive: Not implemented on ${stringify(typeDef)}`); + }, + [TypeDefInfo.Set]: (registry: Registry, typeDef: TypeDef, definitions: Record, imports: TypeImports, withShortcut: boolean) => { throw new Error(`TypeDefInfo.Set: Not implemented on ${stringify(typeDef)}`); }, diff --git a/packages/types-codec/src/extended/Range.ts b/packages/types-codec/src/extended/Range.ts index 59529b15da..fc498b82fa 100644 --- a/packages/types-codec/src/extended/Range.ts +++ b/packages/types-codec/src/extended/Range.ts @@ -53,17 +53,3 @@ export class Range extends Tuple { return `${this.#rangeName}<${this.start.toRawType()}>`; } } - -export class RangeInclusive extends Range { - constructor (registry: Registry, Type: CodecClass | string, value?: AnyTuple) { - super(registry, Type, value, 'RangeInclusive'); - } - - public static override with (Type: CodecClass | string): CodecClass> { - return class extends RangeInclusive { - constructor (registry: Registry, value?: AnyTuple) { - super(registry, Type, value); - } - }; - } -} diff --git a/packages/types-codec/src/extended/RangeInclusive.ts b/packages/types-codec/src/extended/RangeInclusive.ts new file mode 100644 index 0000000000..0de0608ab9 --- /dev/null +++ b/packages/types-codec/src/extended/RangeInclusive.ts @@ -0,0 +1,20 @@ +// Copyright 2017-2022 @polkadot/types-codec authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { AnyTuple, CodecClass, INumber, Registry } from '../types'; + +import { Range } from './Range'; + +export class RangeInclusive extends Range { + constructor (registry: Registry, Type: CodecClass | string, value?: AnyTuple) { + super(registry, Type, value, 'RangeInclusive'); + } + + public static override with (Type: CodecClass | string): CodecClass> { + return class extends RangeInclusive { + constructor (registry: Registry, value?: AnyTuple) { + super(registry, Type, value); + } + }; + } +} diff --git a/packages/types-codec/src/extended/index.ts b/packages/types-codec/src/extended/index.ts index 7005aea1d4..619cd26c79 100644 --- a/packages/types-codec/src/extended/index.ts +++ b/packages/types-codec/src/extended/index.ts @@ -8,7 +8,8 @@ export { Bytes } from './Bytes'; export { HashMap } from './HashMap'; export { Linkage } from './Linkage'; export { CodecMap, CodecMap as Map } from './Map'; -export { Range, RangeInclusive } from './Range'; +export { Range } from './Range'; +export { RangeInclusive } from './RangeInclusive'; export { Type } from './Type'; export { U8aFixed } from './U8aFixed'; export { WrapperKeepOpaque } from './WrapperKeepOpaque'; diff --git a/packages/types-create/src/create/class.ts b/packages/types-create/src/create/class.ts index 502bb50f43..76e4e81911 100644 --- a/packages/types-create/src/create/class.ts +++ b/packages/types-create/src/create/class.ts @@ -122,7 +122,10 @@ const infoMapping: Record C registry.getOrUnknown(value.type), [TypeDefInfo.Range]: (registry: Registry, value: TypeDef): CodecClass => - (value.type.includes('RangeInclusive') ? RangeInclusive : Range).with(getSubType(value)), + createWithSub(Range, value), + + [TypeDefInfo.RangeInclusive]: (registry: Registry, value: TypeDef): CodecClass => + createWithSub(RangeInclusive, value), [TypeDefInfo.Result]: (registry: Registry, value: TypeDef): CodecClass => { const [Ok, Err] = getTypeClassArray(value); diff --git a/packages/types-create/src/types/types.ts b/packages/types-create/src/types/types.ts index 29e06b9731..d637fa1545 100644 --- a/packages/types-create/src/types/types.ts +++ b/packages/types-create/src/types/types.ts @@ -14,6 +14,7 @@ export enum TypeDefInfo { Option, Plain, Range, + RangeInclusive, Result, Set, Si, diff --git a/packages/types-create/src/util/encodeTypes.ts b/packages/types-create/src/util/encodeTypes.ts index 937ff4a1a9..deaf609908 100644 --- a/packages/types-create/src/util/encodeTypes.ts +++ b/packages/types-create/src/util/encodeTypes.ts @@ -31,6 +31,7 @@ function encodeWithParams (registry: Registry, typeDef: TypeDef, outer: string): case TypeDefInfo.Linkage: case TypeDefInfo.Option: case TypeDefInfo.Range: + case TypeDefInfo.RangeInclusive: case TypeDefInfo.Result: case TypeDefInfo.Vec: case TypeDefInfo.WrapperKeepOpaque: @@ -66,12 +67,16 @@ function encodeSubTypes (registry: Registry, sub: TypeDef[], asEnum?: boolean, e const encoders: Record string> = { [TypeDefInfo.BTreeMap]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'BTreeMap'), + [TypeDefInfo.BTreeSet]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'BTreeSet'), + [TypeDefInfo.Compact]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'Compact'), + [TypeDefInfo.DoNotConstruct]: (registry: Registry, { displayName, lookupIndex, lookupName }: TypeDef) => `DoNotConstruct<${lookupName || displayName || (isUndefined(lookupIndex) ? 'Unknown' : registry.createLookupType(lookupIndex))}>`, + [TypeDefInfo.Enum]: (registry: Registry, { sub }: TypeDef): string => { assert(sub && Array.isArray(sub), 'Unable to encode Enum type'); @@ -81,24 +86,36 @@ const encoders: Record st ? stringify({ _enum: sub.map(({ name }, index) => `${name || `Empty${index}`}`) }) : encodeSubTypes(registry, sub, true); }, + [TypeDefInfo.HashMap]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'HashMap'), + [TypeDefInfo.Int]: (registry: Registry, { length = 32 }: TypeDef) => `Int<${length}>`, + [TypeDefInfo.Linkage]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'Linkage'), + // eslint-disable-next-line @typescript-eslint/no-unused-vars [TypeDefInfo.Null]: (registry: Registry, typeDef: TypeDef) => 'Null', + [TypeDefInfo.Option]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'Option'), + // eslint-disable-next-line @typescript-eslint/no-unused-vars [TypeDefInfo.Plain]: (registry: Registry, { displayName, type }: TypeDef) => displayName || type, + [TypeDefInfo.Range]: (registry: Registry, typeDef: TypeDef) => - encodeWithParams(registry, typeDef, typeDef.type.includes('RangeInclusive') ? 'RangeInclusive' : 'Range'), + encodeWithParams(registry, typeDef, 'Range'), + + [TypeDefInfo.RangeInclusive]: (registry: Registry, typeDef: TypeDef) => + encodeWithParams(registry, typeDef, 'RangeInclusive'), + [TypeDefInfo.Result]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'Result'), + // eslint-disable-next-line @typescript-eslint/no-unused-vars [TypeDefInfo.Set]: (registry: Registry, { length = 8, sub }: TypeDef): string => { assert(sub && Array.isArray(sub), 'Unable to encode Set type'); @@ -109,9 +126,11 @@ const encoders: Record st { _bitLength: length || 8 }) }); }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars [TypeDefInfo.Si]: (registry: Registry, { lookupName, type }: TypeDef) => lookupName || type, + [TypeDefInfo.Struct]: (registry: Registry, { alias, sub }: TypeDef): string => { assert(sub && Array.isArray(sub), 'Unable to encode Struct type'); @@ -125,22 +144,28 @@ const encoders: Record st : {} ); }, + [TypeDefInfo.Tuple]: (registry: Registry, { sub }: TypeDef): string => { assert(sub && Array.isArray(sub), 'Unable to encode Tuple type'); return `(${sub.map((type) => encodeTypeDef(registry, type)).join(',')})`; }, + [TypeDefInfo.UInt]: (registry: Registry, { length = 32 }: TypeDef) => `UInt<${length}>`, + [TypeDefInfo.Vec]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'Vec'), + [TypeDefInfo.VecFixed]: (registry: Registry, { length, sub }: TypeDef): string => { assert(isNumber(length) && !isUndefined(sub) && !Array.isArray(sub), 'Unable to encode VecFixed type'); return `[${sub.type};${length}]`; }, + [TypeDefInfo.WrapperKeepOpaque]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'WrapperKeepOpaque'), + [TypeDefInfo.WrapperOpaque]: (registry: Registry, typeDef: TypeDef) => encodeWithParams(registry, typeDef, 'WrapperOpaque') }; diff --git a/packages/types-create/src/util/getTypeDef.ts b/packages/types-create/src/util/getTypeDef.ts index 0c475c0575..41d3c017c1 100644 --- a/packages/types-create/src/util/getTypeDef.ts +++ b/packages/types-create/src/util/getTypeDef.ts @@ -140,14 +140,6 @@ function _decodeFixedVec (value: TypeDef, type: string, _: string, count: number return value; } -function _decodeRange (value: TypeDef, _: string, subType: string): TypeDef { - const Type = getTypeDef(subType); - - value.sub = [Type, Type]; - - return value; -} - // decode a tuple function _decodeTuple (value: TypeDef, _: string, subType: string, count: number): TypeDef { value.sub = subType.length === 0 @@ -201,9 +193,6 @@ const nestedExtraction: [string, string, TypeDefInfo, (value: TypeDef, type: str ['BTreeMap<', '>', TypeDefInfo.BTreeMap, _decodeTuple], ['HashMap<', '>', TypeDefInfo.HashMap, _decodeTuple], ['Int<', '>', TypeDefInfo.Int, _decodeInt], - // Not sure about these, have a specific implementation? - ['Range<', '>', TypeDefInfo.Tuple, _decodeRange], - ['RangeInclusive<', '>', TypeDefInfo.Tuple, _decodeRange], ['Result<', '>', TypeDefInfo.Result, _decodeTuple], ['UInt<', '>', TypeDefInfo.UInt, _decodeUInt], ['DoNotConstruct<', '>', TypeDefInfo.DoNotConstruct, _decodeDoNotConstruct] @@ -214,6 +203,8 @@ const wrappedExtraction: [string, string, TypeDefInfo][] = [ ['Compact<', '>', TypeDefInfo.Compact], ['Linkage<', '>', TypeDefInfo.Linkage], ['Option<', '>', TypeDefInfo.Option], + ['Range<', '>', TypeDefInfo.Range], + ['RangeInclusive<', '>', TypeDefInfo.RangeInclusive], ['Vec<', '>', TypeDefInfo.Vec], ['WrapperKeepOpaque<', '>', TypeDefInfo.WrapperKeepOpaque], ['WrapperOpaque<', '>', TypeDefInfo.WrapperOpaque] diff --git a/packages/types/src/metadata/PortableRegistry/PortableRegistry.ts b/packages/types/src/metadata/PortableRegistry/PortableRegistry.ts index 19344a15e9..05b3390dfd 100644 --- a/packages/types/src/metadata/PortableRegistry/PortableRegistry.ts +++ b/packages/types/src/metadata/PortableRegistry/PortableRegistry.ts @@ -519,7 +519,9 @@ export class PortableRegistry extends Struct implements ILookup { }); } else if (['Range', 'RangeInclusive'].includes(pathFirst)) { return withTypeString(this.registry, { - info: TypeDefInfo.Range, + info: pathFirst === 'Range' + ? TypeDefInfo.Range + : TypeDefInfo.RangeInclusive, sub: this.#createSiDef(params[0].type.unwrap()), type: pathFirst });