diff --git a/arkui-plugins/ui-syntax-plugins/rules/componentV2-state-usage-validation.ts b/arkui-plugins/ui-syntax-plugins/rules/componentV2-state-usage-validation.ts index 2f62ea5af878d57853d78e6e6147cbcdc2ef0bed..f77421dd03d424af64d6cda13f80161f7d12119a 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/componentV2-state-usage-validation.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/componentV2-state-usage-validation.ts @@ -116,6 +116,7 @@ class ComponentV2StateUsageValidationRule extends AbstractUISyntaxRule { message: this.messages.requireOnlyWithParam, fix: (requireDecorator) => { let startPosition = requireDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = requireDecorator.endPosition; return { range: [startPosition, endPosition], @@ -150,6 +151,7 @@ class ComponentV2StateUsageValidationRule extends AbstractUISyntaxRule { data: { annotationName }, fix: (annotation) => { let startPosition = annotation.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = annotation.endPosition; return { range: [startPosition, endPosition], diff --git a/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts b/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts index 2a1d477abd09ebef56d583a9306560881e4d3070..d9a21846ec0263970129e8fd12828410be4b72da 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/computed-decorator-check.ts @@ -80,7 +80,8 @@ class ComputedDecoratorCheckRule extends AbstractUISyntaxRule { node: computedDecorator, message: this.messages.onlyOnGetter, fix: (computedDecorator) => { - const startPosition = computedDecorator.startPosition; + let startPosition = computedDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = computedDecorator.endPosition; return { range: [startPosition, endPosition], @@ -114,7 +115,8 @@ class ComputedDecoratorCheckRule extends AbstractUISyntaxRule { node: computedDecorator, message: this.messages.onlyOnGetter, fix: (computedDecorator) => { - const startPosition = computedDecorator.startPosition; + let startPosition = computedDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = computedDecorator.endPosition; return { range: [startPosition, endPosition], diff --git a/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts b/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts index 9f56e39151138ad28720bd8da0b142954c699aa9..837c8d85f2da7234926b5f998f12a1638e674838 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/consumer-provider-decorator-check.ts @@ -144,7 +144,8 @@ class ConsumerProviderDecoratorCheckRule extends AbstractUISyntaxRule { decorator: getAnnotationName(decorator) }, fix: () => { - const startPosition = otherDecorators.startPosition; + let startPosition = otherDecorators.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = otherDecorators.endPosition; return { range: [startPosition, endPosition], @@ -219,7 +220,8 @@ class ConsumerProviderDecoratorCheckRule extends AbstractUISyntaxRule { decorator: getAnnotationName(decorator), }, fix: (decorator) => { - const startPosition = decorator.startPosition; + let startPosition = decorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = decorator.endPosition; return { range: [startPosition, endPosition], diff --git a/arkui-plugins/ui-syntax-plugins/rules/monitor-decorator-check.ts b/arkui-plugins/ui-syntax-plugins/rules/monitor-decorator-check.ts index 4074a1724565be4fa891609f8cf3e592b3214d7f..8cbd2a27ea3b9a077ad7b08d2e5ad598c0c70f8b 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/monitor-decorator-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/monitor-decorator-check.ts @@ -175,7 +175,8 @@ class MonitorDecoratorCheckRule extends AbstractUISyntaxRule { const startPositions = conflictingDecorators.map(annotation => annotation.startPosition); const endPositions = conflictingDecorators.map(annotation => annotation.endPosition); - const startPosition = startPositions[0]; + let startPosition = startPositions[0]; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = endPositions[endPositions.length - 1]; return { range: [startPosition, endPosition], @@ -206,7 +207,8 @@ class MonitorDecoratorCheckRule extends AbstractUISyntaxRule { node: monitorDecorator, message: this.messages.monitorDecorateMethod, fix: () => { - const startPosition = monitorDecorator.startPosition; + let startPosition = monitorDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = monitorDecorator.endPosition; return { range: [startPosition, endPosition], diff --git a/arkui-plugins/ui-syntax-plugins/rules/no-duplicate-preview.ts b/arkui-plugins/ui-syntax-plugins/rules/no-duplicate-preview.ts index 4cd553402652f69c1383b0f3f05055deae9e07e3..0fa2d00c6d585a1e7dfac97e8d2ca10e917fc171 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/no-duplicate-preview.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/no-duplicate-preview.ts @@ -18,62 +18,63 @@ import { getAnnotationUsage, MAX_PREVIEW_DECORATOR_COUNT, PresetDecorators } fro import { AbstractUISyntaxRule } from './ui-syntax-rule'; class NoDuplicatePreviewRule extends AbstractUISyntaxRule { - private previewDecoratorUsages: arkts.AnnotationUsage[] = []; - private previewDecoratorUsageIndex = 10; + private previewDecoratorUsages: arkts.AnnotationUsage[] = []; + private previewDecoratorUsageIndex = 10; - public setup(): Record { - return { - duplicateEntry: `A page can contain at most 10 '@Preview' annotations.`, - }; - } - - public beforeTransform(): void { - this.previewDecoratorUsages = []; - this.previewDecoratorUsageIndex = 10; - } - - public parsed(node: arkts.StructDeclaration): void { - if (!arkts.isStructDeclaration(node)) { - return; - } - const previewDecoratorUsage = getAnnotationUsage( - node, - PresetDecorators.PREVIEW, - ); - if (previewDecoratorUsage) { - this.previewDecoratorUsages.push(previewDecoratorUsage); + public setup(): Record { + return { + duplicateEntry: `A page can contain at most 10 '@Preview' annotations.`, + }; } - // If the number of preview decorators is less than 10, no error is reported - if (this.previewDecoratorUsages.length <= MAX_PREVIEW_DECORATOR_COUNT) { - return; + + public beforeTransform(): void { + this.previewDecoratorUsages = []; + this.previewDecoratorUsageIndex = 10; } - if (this.previewDecoratorUsageIndex === MAX_PREVIEW_DECORATOR_COUNT) { - this.previewDecoratorUsages.forEach((previewDecoratorUsage) => { - this.reportError(previewDecoratorUsage); - }); - } else { - let previewDecoratorUsage = this.previewDecoratorUsages.at(this.previewDecoratorUsageIndex); - if (!previewDecoratorUsage) { - return; - } - this.reportError(previewDecoratorUsage); + + public parsed(node: arkts.StructDeclaration): void { + if (!arkts.isStructDeclaration(node)) { + return; + } + const previewDecoratorUsage = getAnnotationUsage( + node, + PresetDecorators.PREVIEW, + ); + if (previewDecoratorUsage) { + this.previewDecoratorUsages.push(previewDecoratorUsage); + } + // If the number of preview decorators is less than 10, no error is reported + if (this.previewDecoratorUsages.length <= MAX_PREVIEW_DECORATOR_COUNT) { + return; + } + if (this.previewDecoratorUsageIndex === MAX_PREVIEW_DECORATOR_COUNT) { + this.previewDecoratorUsages.forEach((previewDecoratorUsage) => { + this.reportError(previewDecoratorUsage); + }); + } else { + let previewDecoratorUsage = this.previewDecoratorUsages.at(this.previewDecoratorUsageIndex); + if (!previewDecoratorUsage) { + return; + } + this.reportError(previewDecoratorUsage); + } + this.previewDecoratorUsageIndex++; } - this.previewDecoratorUsageIndex++; - } - private reportError(errorNode: arkts.AnnotationUsage): void { - let startPosition = errorNode.startPosition; - this.report({ - node: errorNode, - message: this.messages.duplicateEntry, - fix: () => { - return { - range: [startPosition, errorNode.endPosition], - code: '', - }; - } - }); - } + private reportError(errorNode: arkts.AnnotationUsage): void { + let startPosition = errorNode.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); + this.report({ + node: errorNode, + message: this.messages.duplicateEntry, + fix: () => { + return { + range: [startPosition, errorNode.endPosition], + code: '', + }; + } + }); + } } export default NoDuplicatePreviewRule; \ No newline at end of file diff --git a/arkui-plugins/ui-syntax-plugins/rules/no-prop-link-objectlink-in-entry.ts b/arkui-plugins/ui-syntax-plugins/rules/no-prop-link-objectlink-in-entry.ts index 5cfe3351c7a85334bf22dc4acde555dee545eab9..7d0b98c834648e5238e2352f5081c0b60ba8c0fd 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/no-prop-link-objectlink-in-entry.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/no-prop-link-objectlink-in-entry.ts @@ -72,6 +72,7 @@ class NoPropLinkObjectLinkInEntryRule extends AbstractUISyntaxRule { }, fix: (annotation) => { let startPosition = annotation.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = annotation.endPosition; return { range: [startPosition, endPosition], diff --git a/arkui-plugins/ui-syntax-plugins/rules/observedV2-trace-usage-validation.ts b/arkui-plugins/ui-syntax-plugins/rules/observedV2-trace-usage-validation.ts index c8a7ae084556bdd107e7b4e9a01bee8b1f7d0db8..c1b3a827c4322b6210450c4319cd3996d5493478 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/observedV2-trace-usage-validation.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/observedV2-trace-usage-validation.ts @@ -49,6 +49,7 @@ class ObservedV2TraceUsageValidationRule extends AbstractUISyntaxRule { message: this.messages.observedV2DecoratorError, fix: (observedV2Decorator) => { let startPosition = observedV2Decorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = observedV2Decorator.endPosition; return { range: [startPosition, endPosition], @@ -65,6 +66,7 @@ class ObservedV2TraceUsageValidationRule extends AbstractUISyntaxRule { message: this.messages.traceMemberVariableError, fix: (traceDecorator) => { let startPosition = traceDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = traceDecorator.endPosition; return { range: [startPosition, endPosition], @@ -101,6 +103,7 @@ class ObservedV2TraceUsageValidationRule extends AbstractUISyntaxRule { message: this.messages.traceDecoratorError, fix: (traceDecorator) => { let startPosition = traceDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = traceDecorator.endPosition; return { range: [startPosition, endPosition], diff --git a/arkui-plugins/ui-syntax-plugins/rules/once-decorator-check.ts b/arkui-plugins/ui-syntax-plugins/rules/once-decorator-check.ts index 85e8bd8cf2f3ac63683792b8eccf039a19b01d33..26bec5af19407b293cb3a1a76a96a0563dbd599d 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/once-decorator-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/once-decorator-check.ts @@ -27,13 +27,12 @@ class OnceDecoratorCheckRule extends AbstractUISyntaxRule { } public parsed(node: arkts.AstNode): void { - let onceDecorator: arkts.AnnotationUsage | undefined; this.validateOnlyInStruct(node); this.validateOnlyOnProperty(node); if (arkts.isStructDeclaration(node)) { - this.validateDecorator(node, onceDecorator); + this.validateDecorator(node); } } @@ -75,7 +74,8 @@ class OnceDecoratorCheckRule extends AbstractUISyntaxRule { node: decorator, message: message, fix: (decorator) => { - const startPosition = decorator.startPosition; + let startPosition = decorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = decorator.endPosition; return { range: [startPosition, endPosition], @@ -95,48 +95,39 @@ class OnceDecoratorCheckRule extends AbstractUISyntaxRule { private validateDecorator( node: arkts.StructDeclaration, - onceDecorator: arkts.AnnotationUsage | undefined, ): void { node.definition?.body.forEach(body => { // Check if @Once is used on a property and if @Param is used with if (arkts.isClassProperty(body)) { - this.validatePropertyAnnotations(body, onceDecorator); + this.validatePropertyAnnotations(body); } }); } private validatePropertyAnnotations( - body: arkts.ClassProperty, - onceDecorator: arkts.AnnotationUsage | undefined + body: arkts.ClassProperty ): void { const propertyAnnotations = getClassPropertyAnnotationNames(body); - onceDecorator = findDecorator(body, PresetDecorators.ONCE); + const onceDecorator = findDecorator(body, PresetDecorators.ONCE); if (onceDecorator) { const isParamUsed = propertyAnnotations.includes(PresetDecorators.PARAM); - // If @Once is found, check if @Param is also used + // If @Once is found, check if @Param is not used if (!isParamUsed) { this.reportMissingParamWithOnce(onceDecorator); - } else { - // If both @Once and @Param are used, check for other - // incompatible decorators - const otherDecorators = body.annotations?.find(annotation => - annotation.expr && arkts.isIdentifier(annotation.expr) && - annotation.expr.name !== PresetDecorators.ONCE && - annotation.expr.name !== PresetDecorators.PARAM - ); - this.reportInvalidDecoratorsWithOnceAndParam(otherDecorators); } } } - private reportMissingParamWithOnce(onceDecorator: arkts.AnnotationUsage | undefined): void { + private reportMissingParamWithOnce( + onceDecorator: arkts.AnnotationUsage | undefined + ): void { if (!onceDecorator) { return; } this.report({ node: onceDecorator, message: this.messages.invalidDecorator, - fix: (onceDecorator) => { + fix: () => { const startPosition = onceDecorator.endPosition; const endPosition = onceDecorator.endPosition; return { @@ -146,24 +137,6 @@ class OnceDecoratorCheckRule extends AbstractUISyntaxRule { } }); } - - private reportInvalidDecoratorsWithOnceAndParam(otherDecorators: arkts.AnnotationUsage | undefined): void { - if (!otherDecorators) { - return; - } - this.report({ - node: otherDecorators, - message: this.messages.invalidDecorator, - fix: (otherDecorators) => { - const startPosition = otherDecorators.startPosition; - const endPosition = otherDecorators.endPosition; - return { - range: [startPosition, endPosition], - code: '' - }; - } - }); - } } export default OnceDecoratorCheckRule; \ No newline at end of file diff --git a/arkui-plugins/ui-syntax-plugins/rules/one-decorator-on-function-method.ts b/arkui-plugins/ui-syntax-plugins/rules/one-decorator-on-function-method.ts index f31cfec4ad1e92cf52c584d8b9562a9f4d741bf1..69c7eb7ac70431e0f0a48f4b4dbc41b7a81361df 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/one-decorator-on-function-method.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/one-decorator-on-function-method.ts @@ -107,7 +107,8 @@ class OneDecoratorOnFunctionMethodRule extends AbstractUISyntaxRule { node: annotation, message: this.messages.invalidDecorator, fix: () => { - const startPosition = otherDecorator.startPosition; + let startPosition = otherDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); const endPosition = otherDecorator.endPosition; return { range: [startPosition, endPosition], diff --git a/arkui-plugins/ui-syntax-plugins/rules/track-decorator-check.ts b/arkui-plugins/ui-syntax-plugins/rules/track-decorator-check.ts index e7ab4ec8da51785ea1889a3ec2d4b9b590aebf86..ec80d3afd03ed13e07234b9fe0b9db6da4b4a148 100644 --- a/arkui-plugins/ui-syntax-plugins/rules/track-decorator-check.ts +++ b/arkui-plugins/ui-syntax-plugins/rules/track-decorator-check.ts @@ -111,6 +111,7 @@ class TrackDecoratorCheckRule extends AbstractUISyntaxRule { message: this.messages.trackMustUsedWithObserved, fix: (trackDecorator) => { let startPosition = trackDecorator.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = trackDecorator.endPosition; return { range: [startPosition, endPosition], @@ -126,6 +127,7 @@ class TrackDecoratorCheckRule extends AbstractUISyntaxRule { message: this.messages.trackOnClassMemberOnly, fix: (node) => { let startPosition = node.startPosition; + startPosition = arkts.SourcePosition.create(startPosition.index() - 1, startPosition.line()); let endPosition = node.endPosition; return { range: [startPosition, endPosition],