Entities semplification

* Entities semplification WIP

* Bug fixes after entity semplification

* Fix object serialization
This commit is contained in:
barsdeveloper
2023-05-05 18:50:31 +02:00
committed by GitHub
parent 4eb1ff2a7c
commit 90f19e1bca
26 changed files with 181 additions and 391 deletions

View File

@@ -9,6 +9,7 @@ export default class FormatTextEntity extends IEntity {
static attributes = {
value: {
type: [new UnionType(String, LocalizedTextEntity, InvariantTextEntity, FormatTextEntity)],
default: [],
},
}

View File

@@ -7,15 +7,12 @@ export default class FunctionReferenceEntity extends IEntity {
static attributes = {
MemberParent: {
type: ObjectReferenceEntity,
showDefault: false
},
MemberName: {
type: String,
showDefault: false,
},
MemberGuid: {
type: GuidEntity,
showDefault: false,
},
}

View File

@@ -18,7 +18,6 @@ import Utility from "../Utility.js"
* @typedef {{
* type?: AttributeType,
* default?: AnyValue | ValueSupplier,
* showDefault?: Boolean,
* nullable?: Boolean,
* ignored?: Boolean,
* serialized?: Boolean,
@@ -48,7 +47,6 @@ export default class IEntity {
/** @type {AttributeDeclarations} */
static attributes = {}
static defaultAttribute = {
showDefault: true,
nullable: false,
ignored: false,
serialized: false,
@@ -66,7 +64,7 @@ export default class IEntity {
attributes[k] = {
...IEntity.defaultAttribute,
...attributes[k],
...values.attributes[k]
...values.attributes[k],
}
if (!attributes[k].type) {
attributes[k].type = values[k] instanceof Array
@@ -78,7 +76,7 @@ export default class IEntity {
}
/** @type {AttributeDeclarations?} */ this.attributes
if (values.constructor !== Object && Object.keys(attributes).length === 1) {
// Where there is just one attribute, option can be the value of that attribute
// If values is not an object but the only value this entity can have
values = {
[Object.keys(attributes)[0]]: values
}
@@ -86,7 +84,7 @@ export default class IEntity {
const valuesNames = Object.keys(values)
const attributesNames = Object.keys(attributes)
const allAttributesNames = Utility.mergeArrays(attributesNames, valuesNames)
for (let attributeName of allAttributesNames) {
for (const attributeName of allAttributesNames) {
let value = values[attributeName]
let attribute = attributes[attributeName]
@@ -101,26 +99,12 @@ export default class IEntity {
}
if (!attribute) {
// Remember attributeName can come from the values and be not defined in the attributes
// In that case just assign it and skip the rest
// Remember attributeName can come from the values and be not defined in the attributes.
// In that case just assign it and skip the rest.
this[attributeName] = value
continue
}
let defaultValue = attribute.default
let defaultType = attribute.type
if (defaultType instanceof ComputedType) {
defaultType = defaultType.compute(this)
}
if (defaultType instanceof Array) {
defaultType = Array
}
if (defaultValue instanceof Function) {
defaultValue = defaultValue(this)
}
if (defaultType === undefined) {
defaultType = Utility.getType(defaultValue)
}
const assignAttribute = !attribute.predicate
? v => this[attributeName] = v
: v => {
@@ -149,6 +133,21 @@ export default class IEntity {
this[attributeName] = v
}
let defaultValue = attribute.default
if (defaultValue instanceof Function) {
defaultValue = defaultValue(this)
}
let defaultType = attribute.type
if (defaultType instanceof ComputedType) {
defaultType = defaultType.compute(this)
}
if (defaultType instanceof Array) {
defaultType = Array
}
if (defaultType === undefined) {
defaultType = Utility.getType(defaultValue)
}
if (value !== undefined) {
// Remember value can still be null
if (value?.constructor === String && attribute.serialized && defaultType !== String) {
@@ -157,43 +156,15 @@ export default class IEntity {
.getSerializer(defaultType)
.read(/** @type {String} */(value))
}
if (defaultType instanceof MirroredEntity && !(value instanceof MirroredEntity)) {
value = undefined // Value is discarded as it is mirrored from another one
value = new MirroredEntity(defaultType.type, defaultType.key)
this[attributeName] = value
} else {
assignAttribute(Utility.sanitize(value, /** @type {AnyValueConstructor<*>} */(defaultType)))
}
assignAttribute(Utility.sanitize(value, /** @type {AnyValueConstructor<*>} */(defaultType)))
continue // We have a value, need nothing more
}
if (defaultType instanceof UnionType) {
if (defaultValue != undefined) {
defaultType = defaultType.types.find(
type => defaultValue instanceof type || defaultValue.constructor == type
) ?? defaultType.getFirstType()
} else {
defaultType = defaultType.getFirstType()
}
if (defaultValue !== undefined) {
assignAttribute(Utility.sanitize(
/** @type {AnyValue} */(defaultValue),
/** @type {AnyValueConstructor<AnyValue>} */(defaultType)
))
}
if (!attribute.showDefault) {
assignAttribute(undefined) // Declare undefined to preserve the order of attributes
continue
}
// if (defaultValue === undefined) {
// defaultValue = Utility.sanitize(new /** @type {AnyValueConstructor<*>} */(defaultType)())
// }
if (attribute.serialized) {
if (defaultType !== String && defaultValue.constructor === String) {
defaultValue = SerializerFactory
// @ts-expect-error
.getSerializer(defaultType)
.read(defaultValue)
}
}
assignAttribute(Utility.sanitize(
/** @type {AnyValue} */(defaultValue),
/** @type {AnyValueConstructor<AnyValue>} */(defaultType)
))
}
}
@@ -233,16 +204,11 @@ export default class IEntity {
? [Utility.getType(attribute.default[0])]
: Utility.getType(attribute.default)
}
if (attribute.default === undefined) {
if (attribute.type === undefined) {
throw new Error(
`UEBlueprint: Expected either "type" or "value" property in ${this.name} attribute ${prefix}`
+ attributeName
)
}
if (attribute.showDefault) {
attribute.default = this.defaultValueProviderFromType(attribute.type)
}
if (attribute.default === undefined && attribute.type === undefined) {
throw new Error(
`UEBlueprint: Expected either "type" or "value" property in ${this.name} attribute ${prefix}`
+ attributeName
)
}
if (attribute.default === null) {
attribute.nullable = true

View File

@@ -7,14 +7,17 @@ export default class LinearColorEntity extends IEntity {
static attributes = {
R: {
type: RealUnitEntity,
default: () => new RealUnitEntity(),
expected: true,
},
G: {
type: RealUnitEntity,
default: () => new RealUnitEntity(),
expected: true,
},
B: {
type: RealUnitEntity,
default: () => new RealUnitEntity(),
expected: true,
},
A: {
@@ -23,17 +26,17 @@ export default class LinearColorEntity extends IEntity {
},
H: {
type: RealUnitEntity,
showDefault: true,
default: () => new RealUnitEntity(),
ignored: true,
},
S: {
type: RealUnitEntity,
showDefault: true,
default: () => new RealUnitEntity(),
ignored: true,
},
V: {
type: RealUnitEntity,
showDefault: true,
default: () => new RealUnitEntity(),
ignored: true,
},
}

View File

@@ -7,12 +7,15 @@ export default class MacroGraphReferenceEntity extends IEntity {
static attributes = {
MacroGraph: {
type: ObjectReferenceEntity,
default: () => new ObjectReferenceEntity(),
},
GraphBlueprint: {
type: ObjectReferenceEntity,
default: () => new ObjectReferenceEntity(),
},
GraphGuid: {
type: GuidEntity,
default: () => new GuidEntity(),
},
}

View File

@@ -27,230 +27,163 @@ export default class ObjectEntity extends IEntity {
},
AxisKey: {
type: SymbolEntity,
showDefault: false,
},
InputAxisKey: {
type: SymbolEntity,
showDefault: false,
},
bIsPureFunc: {
default: false,
showDefault: false,
type: Boolean,
},
bIsConstFunc: {
default: false,
showDefault: false,
type: Boolean,
},
VariableReference: {
type: VariableReferenceEntity,
default: null,
showDefault: false,
},
SelfContextInfo: {
type: SymbolEntity,
default: null,
showDefault: false,
},
DelegatePropertyName: {
type: String,
showDefault: false,
},
DelegateOwnerClass: {
type: ObjectReferenceEntity,
showDefault: false,
},
ComponentPropertyName: {
type: String,
showDefault: false,
},
EventReference: {
type: FunctionReferenceEntity,
default: null,
showDefault: false,
},
FunctionReference: {
type: FunctionReferenceEntity,
default: null,
showDefault: false,
},
CustomFunctionName: {
type: String,
showDefault: false,
},
TargetType: {
type: ObjectReferenceEntity,
default: null,
showDefault: false,
},
MacroGraphReference: {
type: MacroGraphReferenceEntity,
default: null,
showDefault: false,
},
Enum: {
type: ObjectReferenceEntity,
showDefault: false,
},
EnumEntries: {
type: [String],
showDefault: false,
inlined: true,
},
InputKey: {
type: SymbolEntity,
showDefault: false,
},
bOverrideFunction: {
type: Boolean,
showDefault: false,
},
bInternalEvent: {
type: Boolean,
showDefault: false,
},
bConsumeInput: {
type: Boolean,
showDefault: false,
},
bExecuteWhenPaused: {
type: Boolean,
showDefault: false,
},
bOverrideParentBinding: {
type: Boolean,
showDefault: false,
},
bControl: {
type: Boolean,
showDefault: false,
},
bAlt: {
type: Boolean,
showDefault: false,
},
bShift: {
type: Boolean,
showDefault: false,
},
bCommand: {
type: Boolean,
showDefault: false,
},
CommentColor: {
type: LinearColorEntity,
showDefault: false,
},
bCommentBubbleVisible_InDetailsPanel: {
type: Boolean,
showDefault: false,
},
bColorCommentBubble: {
type: Boolean,
default: false,
showDefault: false,
},
R: {
type: Number,
showDefault: false,
},
G: {
type: Number,
showDefault: false,
},
MaterialExpression: {
type: ObjectReferenceEntity,
showDefault: false,
},
MoveMode: {
type: SymbolEntity,
showDefault: false,
},
TimelineName: {
type: String,
showDefault: false,
},
TimelineGuid: {
type: GuidEntity,
showDefault: false,
},
SizeX: {
type: new MirroredEntity(ObjectEntity, "NodeWidth"),
showDefault: false,
},
SizeY: {
type: new MirroredEntity(ObjectEntity, "NodeHeight"),
showDefault: false,
},
Text: {
type: new MirroredEntity(ObjectEntity, "NodeComment"),
showDefault: false,
},
MaterialExpressionEditorX: {
type: new MirroredEntity(ObjectEntity, "NodePosX"),
showDefault: false,
},
MaterialExpressionEditorY: {
type: new MirroredEntity(ObjectEntity, "NodePosY"),
showDefault: false,
},
NodePosX: {
type: IntegerEntity,
showDefault: false,
},
NodePosY: {
type: IntegerEntity,
showDefault: false,
},
NodeWidth: {
type: IntegerEntity,
showDefault: false,
},
NodeHeight: {
type: IntegerEntity,
showDefault: false,
},
bCanRenameNode: {
type: Boolean,
showDefault: false,
},
bCommentBubblePinned: {
type: Boolean,
showDefault: false,
},
bCommentBubbleVisible: {
type: Boolean,
showDefault: false,
},
Text: {
type: String,
showDefault: false,
},
NodeComment: {
type: String,
showDefault: false,
},
AdvancedPinDisplay: {
type: IdentifierEntity,
default: null,
showDefault: false,
},
EnabledState: {
type: IdentifierEntity,
default: null,
showDefault: false,
},
NodeGuid: {
type: GuidEntity,
showDefault: false,
},
ErrorType: {
type: IntegerEntity,
showDefault: false,
},
ErrorMsg: {
type: String,
default: "",
showDefault: false,
},
CustomProperties: {
type: [new UnionType(PinEntity, UnknownPinEntity)],
@@ -422,7 +355,7 @@ export default class ObjectEntity extends IEntity {
}
getClass() {
return this.Class.path ? this.Class.path : this.Class.type
return this.Class?.path ? this.Class.path : this.Class?.type ?? ""
}
getType() {

View File

@@ -28,6 +28,10 @@ export default class ObjectReferenceEntity extends IEntity {
/** @type {String} */ this.path
}
static createNoneInstance() {
return new ObjectReferenceEntity({ type: "None", path: "" })
}
sanitize() {
if (this.type && !this.type.startsWith("/")) {
let deprecatedType = this.type + "_Deprecated"

View File

@@ -56,37 +56,33 @@ export default class PinEntity extends IEntity {
static attributes = {
PinId: {
type: GuidEntity,
default: () => new GuidEntity()
},
PinName: {
default: "",
},
PinFriendlyName: {
type: new UnionType(LocalizedTextEntity, FormatTextEntity, String),
showDefault: false,
},
PinToolTip: {
type: String,
showDefault: false,
},
Direction: {
type: String,
showDefault: false,
},
PinType: {
type: PinTypeEntity,
default: () => new PinTypeEntity(),
inlined: true,
},
LinkedTo: {
type: [PinReferenceEntity],
showDefault: false,
},
SubPins: {
type: [PinReferenceEntity],
showDefault: false,
},
ParentPin: {
type: PinReferenceEntity,
showDefault: false,
},
DefaultValue: {
type: new ComputedType(
@@ -94,15 +90,12 @@ export default class PinEntity extends IEntity {
pinEntity => pinEntity.getEntityType(true) ?? String
),
serialized: true,
showDefault: false,
},
AutogeneratedDefaultValue: {
type: String,
showDefault: false,
},
DefaultObject: {
type: ObjectReferenceEntity,
showDefault: false,
default: null,
},
PersistentGuid: {
@@ -275,7 +268,7 @@ export default class PinEntity extends IEntity {
})
if (indexElement >= 0) {
this.LinkedTo.splice(indexElement, 1)
if (this.LinkedTo.length === 0 && !PinEntity.attributes.LinkedTo.showDefault) {
if (this.LinkedTo.length === 0 && PinEntity.attributes.LinkedTo.default === undefined) {
this.LinkedTo = undefined
}
return true

View File

@@ -14,6 +14,7 @@ export default class PinTypeEntity extends IEntity {
},
PinSubCategoryObject: {
type: ObjectReferenceEntity,
default: () => ObjectReferenceEntity.createNoneInstance(),
},
PinSubCategoryMemberReference: {
type: FunctionReferenceEntity,

View File

@@ -5,12 +5,15 @@ export default class RotatorEntity extends IEntity {
static attributes = {
R: {
default: 0,
expected: true,
},
P: {
default: 0,
expected: true,
},
Y: {
default: 0,
expected: true,
},
}

View File

@@ -4,24 +4,19 @@ export default class TerminalTypeEntity extends IEntity {
static attributes = {
TerminalCategory: {
default: "",
showDefault: false,
type: String,
},
TerminalSubCategory: {
default: "",
showDefault: false,
type: String,
},
bTerminalIsConst: {
default: false,
showDefault: false,
type: Boolean,
},
bTerminalIsWeakPointer: {
default: false,
showDefault: false,
type: Boolean,
},
bTerminalIsUObjectWrapper: {
default: false,
showDefault: false,
type: Boolean,
},
}

View File

@@ -5,7 +5,6 @@ export default class UnknownKeysEntity extends IEntity {
static attributes = {
lookbehind: {
default: "",
showDefault: true,
ignored: true,
},
}

View File

@@ -5,8 +5,7 @@ export default class VariableReferenceEntity extends IEntity {
static attributes = {
MemberScope: {
default: "",
showDefault: false,
type: String,
},
MemberName: {
default: "",
@@ -15,8 +14,7 @@ export default class VariableReferenceEntity extends IEntity {
type: GuidEntity,
},
bSelfContext: {
default: false,
showDefault: false,
type: Boolean,
},
}

View File

@@ -6,13 +6,12 @@ import PinEntity from "../PinEntity.js"
export default class KnotEntity extends ObjectEntity {
/**
* @param {Object} options
* @param {Object} values
* @param {PinEntity} pinReferenceForType
*/
constructor(options = {}, pinReferenceForType = undefined) {
super(options, true)
this.Class = new ObjectReferenceEntity(Configuration.paths.knot)
this.Name = "K2Node_Knot"
constructor(values = {}, pinReferenceForType = undefined) {
values.Class = new ObjectReferenceEntity(Configuration.paths.knot)
values.Name = "K2Node_Knot"
const inputPinEntity = new PinEntity(
{
PinName: "InputPin",
@@ -30,6 +29,7 @@ export default class KnotEntity extends ObjectEntity {
inputPinEntity.copyTypeFrom(pinReferenceForType)
outputPinEntity.copyTypeFrom(pinReferenceForType)
}
this.CustomProperties = [inputPinEntity, outputPinEntity]
values.CustomProperties = [inputPinEntity, outputPinEntity]
super(values, true)
}
}