@@ -7,11 +7,12 @@ import generateSolutionNoGlobals from "./solutions/noGlobals.js";
7
7
import { getLogger } from "@ui5/logger" ;
8
8
import { addDependencies } from "./solutions/amdImports.js" ;
9
9
import { RequireExpression } from "../linter/ui5Types/amdTranspiler/parseRequire.js" ;
10
+ import { Resource } from "@ui5/fs" ;
10
11
11
12
const log = getLogger ( "linter:autofix" ) ;
12
13
13
14
export interface AutofixResource {
14
- content : string ;
15
+ resource : Resource ;
15
16
messages : RawLintMessage [ ] ;
16
17
}
17
18
@@ -147,19 +148,57 @@ function getJsErrors(code: string, resourcePath: string) {
147
148
} ) ;
148
149
}
149
150
150
- // eslint-disable-next-line @typescript-eslint/require-await
151
+ function getAutofixMessages ( resource : AutofixResource ) {
152
+ // Collect modules of which at least one message has the conditional fixHint flag set
153
+ const conditionalModuleAccess = new Set < string > ( ) ;
154
+ for ( const msg of resource . messages ) {
155
+ if ( msg . fixHints ?. moduleName && msg . fixHints ?. conditional ) {
156
+ log . verbose ( `Skipping fixes that would import module '${ msg . fixHints . moduleName } ' ` +
157
+ `because of conditional global access within the current file.` ) ;
158
+ conditionalModuleAccess . add ( msg . fixHints . moduleName ) ;
159
+ }
160
+ }
161
+
162
+ // Group messages by id
163
+ const messagesById = new Map < MESSAGE , RawLintMessage [ ] > ( ) ;
164
+ for ( const msg of resource . messages ) {
165
+ if ( msg . fixHints ?. moduleName && conditionalModuleAccess . has ( msg . fixHints . moduleName ) ) {
166
+ // Skip messages with conditional fixHints
167
+ continue ;
168
+ }
169
+ if ( ! messagesById . has ( msg . id ) ) {
170
+ messagesById . set ( msg . id , [ ] ) ;
171
+ }
172
+ messagesById . get ( msg . id ) ! . push ( msg ) ;
173
+ }
174
+
175
+ return messagesById ;
176
+ }
177
+
151
178
export default async function ( {
152
179
rootDir : _unused1 ,
153
180
namespace : _unused2 ,
154
- resources,
181
+ resources : autofixResources ,
155
182
context,
156
183
} : AutofixOptions ) : Promise < AutofixResult > {
184
+ // Only collect and parse files for which fixes are available
185
+ const resources : Resource [ ] = [ ] ;
186
+ for ( const [ _ , autofixResource ] of autofixResources ) {
187
+ const messagesById = getAutofixMessages ( autofixResource ) ;
188
+ // Currently only global access autofixes are supported
189
+ // This needs to stay aligned with the applyFixes function
190
+ if ( messagesById . has ( MESSAGE . NO_GLOBALS ) ) {
191
+ resources . push ( autofixResource . resource ) ;
192
+ }
193
+ }
194
+
157
195
const sourceFiles : SourceFiles = new Map ( ) ;
158
196
const resourcePaths = [ ] ;
159
- for ( const [ resourcePath , resource ] of resources ) {
197
+ for ( const resource of resources ) {
198
+ const resourcePath = resource . getPath ( ) ;
160
199
const sourceFile = ts . createSourceFile (
161
- resourcePath ,
162
- resource . content ,
200
+ resource . getPath ( ) ,
201
+ await resource . getString ( ) ,
163
202
{
164
203
languageVersion : ts . ScriptTarget . ES2022 ,
165
204
jsDocParsingMode : ts . JSDocParsingMode . ParseNone ,
@@ -176,7 +215,7 @@ export default async function ({
176
215
const res : AutofixResult = new Map ( ) ;
177
216
for ( const [ resourcePath , sourceFile ] of sourceFiles ) {
178
217
log . verbose ( `Applying autofixes to ${ resourcePath } ` ) ;
179
- const newContent = applyFixes ( checker , sourceFile , resourcePath , resources . get ( resourcePath ) ! ) ;
218
+ const newContent = applyFixes ( checker , sourceFile , resourcePath , autofixResources . get ( resourcePath ) ! ) ;
180
219
if ( newContent ) {
181
220
const jsErrors = getJsErrors ( newContent , resourcePath ) ;
182
221
if ( jsErrors . length ) {
@@ -199,7 +238,7 @@ function applyFixes(
199
238
checker : ts . TypeChecker , sourceFile : ts . SourceFile , resourcePath : ResourcePath ,
200
239
resource : AutofixResource
201
240
) : string | undefined {
202
- const { content} = resource ;
241
+ const content = sourceFile . getFullText ( ) ;
203
242
204
243
// Collect modules of which at least one message has the conditional fixHint flag set
205
244
const conditionalModuleAccess = new Set < string > ( ) ;
0 commit comments