!917 fix Wrong definition of multiple types of state variables

Merge pull request !917 from Bo Jiang/foxtype
This commit is contained in:
openharmony_ci
2022-08-08 11:20:22 +00:00
committed by Gitee
2 changed files with 22 additions and 6 deletions
+4 -4
View File
@@ -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;
+18 -2
View File
@@ -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()
});
}