mirror of
https://github.com/openharmony/developtools_ace-ets2bundle.git
synced 2026-07-19 16:43:34 -04:00
!917 fix Wrong definition of multiple types of state variables
Merge pull request !917 from Bo Jiang/foxtype
This commit is contained in:
@@ -142,7 +142,7 @@ function processMembers(members: ts.NodeArray<ts.ClassElement>, parentComponentN
|
||||
newMembers.push(item);
|
||||
validateDecorators(item, log);
|
||||
} else {
|
||||
addPropertyMember(item, newMembers, program, parentComponentName.getText());
|
||||
addPropertyMember(item, newMembers, program, parentComponentName.getText(), log);
|
||||
const result: UpdateResult = processMemberVariableDecorators(parentComponentName, item,
|
||||
ctorNode, watchMap, checkController, log, program, context, hasPreview, interfaceNode);
|
||||
if (result.isItemUpdate()) {
|
||||
@@ -203,7 +203,7 @@ function validateDecorators(item: ts.ClassElement, log: LogInfo[]): void {
|
||||
}
|
||||
|
||||
function addPropertyMember(item: ts.ClassElement, newMembers: ts.ClassElement[],
|
||||
program: ts.Program, parentComponentName: string): void {
|
||||
program: ts.Program, parentComponentName: string, log: LogInfo[]): void {
|
||||
const propertyItem: ts.PropertyDeclaration = item as ts.PropertyDeclaration;
|
||||
let decoratorName: string;
|
||||
let updatePropertyItem: ts.PropertyDeclaration;
|
||||
@@ -219,13 +219,13 @@ function addPropertyMember(item: ts.ClassElement, newMembers: ts.ClassElement[],
|
||||
switch (decoratorName) {
|
||||
case COMPONENT_STATE_DECORATOR:
|
||||
case COMPONENT_PROVIDE_DECORATOR:
|
||||
newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program) ?
|
||||
newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program, log) ?
|
||||
OBSERVED_PROPERTY_SIMPLE : OBSERVED_PROPERTY_OBJECT, [type ||
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)]);
|
||||
break;
|
||||
case COMPONENT_LINK_DECORATOR:
|
||||
case COMPONENT_CONSUME_DECORATOR:
|
||||
newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program) ?
|
||||
newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program, log) ?
|
||||
SYNCHED_PROPERTY_SIMPLE_TWO_WAY : SYNCHED_PROPERTY_SIMPLE_ONE_WAY, [type ||
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)]);
|
||||
break;
|
||||
|
||||
@@ -680,7 +680,7 @@ function isForbiddenUseStateType(typeNode: ts.TypeNode): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
export function isSimpleType(typeNode: ts.TypeNode, program: ts.Program): boolean {
|
||||
export function isSimpleType(typeNode: ts.TypeNode, program: ts.Program, log?: LogInfo[]): boolean {
|
||||
let checker: ts.TypeChecker;
|
||||
if (globalProgram.program) {
|
||||
checker = globalProgram.program.getTypeChecker();
|
||||
@@ -694,9 +694,17 @@ export function isSimpleType(typeNode: ts.TypeNode, program: ts.Program): boolea
|
||||
return true;
|
||||
} else if (ts.isUnionTypeNode(typeNode) && typeNode.types) {
|
||||
const types: ts.NodeArray<ts.TypeNode> = typeNode.types;
|
||||
let basicType: boolean = false;
|
||||
let referenceType: boolean = false;
|
||||
for (let i = 0; i < types.length; i++) {
|
||||
const enumType: ts.SyntaxKind = getEnumType(types[i], checker);
|
||||
if (!simpleTypes.has(enumType || types[i].kind) && !isEnumtype(typeNode)) {
|
||||
if (simpleTypes.has(enumType || types[i].kind) || isEnumtype(typeNode)) {
|
||||
basicType = true;
|
||||
} else {
|
||||
referenceType = true;
|
||||
}
|
||||
if (basicType && referenceType && log) {
|
||||
validateVariableType(typeNode, log);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -879,3 +887,11 @@ function validateWatchParam(type: LogType, pos: number, log: LogInfo[]): void {
|
||||
});
|
||||
}
|
||||
|
||||
function validateVariableType(typeNode: ts.TypeNode, log: LogInfo[]): void {
|
||||
log.push({
|
||||
type: LogType.ERROR,
|
||||
message: 'The state variable type of a struct component cannot be declared by both a simple type and an object type.',
|
||||
pos: typeNode.getStart()
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user