-
Notifications
You must be signed in to change notification settings - Fork 56
/
field-type-class.ts
70 lines (67 loc) · 2.01 KB
/
field-type-class.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import {
ClassDeclarationStructure,
PropertyDeclarationStructure,
StructureKind
} from 'ts-morph';
import { caps, ODataVersion } from '@sap-cloud-sdk/util';
import {
getComplexTypeFieldDescription,
getComplexTypePropertyDescription
} from '../typedoc';
import { VdmComplexType, VdmProperty } from '../vdm-types';
import {
getGenericParameters,
createPropertyFieldInitializer
} from '../generator-utils';
export function fieldTypeClass(
complexType: VdmComplexType,
oDataVersion: ODataVersion
): ClassDeclarationStructure {
return {
kind: StructureKind.Class,
name: `${complexType.fieldType}<EntityT extends Entity${caps(
oDataVersion
)}>`,
extends: `ComplexTypeField<EntityT, ${complexType.typeName}>`,
isExported: true,
properties: properties(complexType),
docs: [getComplexTypeFieldDescription(complexType)],
ctors: [
{
parameters: [
{
name: 'fieldName',
type: 'string'
},
{
name: 'fieldOf',
type: 'ConstructorOrField<EntityT>'
}
],
docs: [
`\nCreates an instance of ${complexType.fieldType}.\n\n@param fieldName - Actual name of the field as used in the OData request.\n@param fieldOf - Either the parent entity constructor of the parent complex type this field belongs to.`
],
statements: [`super(fieldName, fieldOf, ${complexType.typeName});`]
}
]
};
}
function properties(
complexType: VdmComplexType
): PropertyDeclarationStructure[] {
return complexType.properties.map((prop: VdmProperty) =>
property(prop, complexType)
);
}
function property(
prop: VdmProperty,
complexType: VdmComplexType
): PropertyDeclarationStructure {
return {
kind: StructureKind.Property,
name: prop.instancePropertyName,
type: `${prop.fieldType}<${getGenericParameters('EntityT', prop)}>`,
initializer: createPropertyFieldInitializer(prop, 'this'),
docs: [getComplexTypePropertyDescription(prop, complexType.typeName)]
};
}