From a74418d0b3b2b108a730a5039140a97b5f4e40fd Mon Sep 17 00:00:00 2001 From: "Lyu, Wei Da" Date: Mon, 5 Sep 2022 10:18:48 +0800 Subject: [PATCH] (fix) new line before the JSDoc of the first import --- .../nodes/handleImportDeclaration.ts | 29 +++++++++++++++++++ .../processInstanceScriptContent.ts | 14 ++++----- .../jsdoc-before-first-import/expected.tsx | 17 +++++++++++ .../jsdoc-before-first-import/expectedv2.ts | 17 +++++++++++ .../jsdoc-before-first-import/input.svelte | 6 ++++ 5 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expected.tsx create mode 100644 packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expectedv2.ts create mode 100644 packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/input.svelte diff --git a/packages/svelte2tsx/src/svelte2tsx/nodes/handleImportDeclaration.ts b/packages/svelte2tsx/src/svelte2tsx/nodes/handleImportDeclaration.ts index e82f0a2f9..91767a3c9 100644 --- a/packages/svelte2tsx/src/svelte2tsx/nodes/handleImportDeclaration.ts +++ b/packages/svelte2tsx/src/svelte2tsx/nodes/handleImportDeclaration.ts @@ -68,3 +68,32 @@ function isNewGroup( return false; } + +/** + * ensure it's in a newline. + * if file has module script ensure an empty line to separate imports + */ +export function handleFirstInstanceImport( + tsAst: ts.SourceFile, + astOffset: number, + hasModuleScript: boolean, + str: MagicString +) { + const firstImport = tsAst.statements + .filter(ts.isImportDeclaration) + .sort((a, b) => a.end - b.end)[0]; + if (!firstImport) { + return; + } + + const firstComment = Array.from( + ts.getLeadingCommentRanges(firstImport.getFullText(), 0) ?? [] + ).sort((a, b) => a.pos - b.pos)[0]; + + const start = + firstComment && firstComment.kind === ts.SyntaxKind.MultiLineCommentTrivia + ? firstComment.pos + firstImport.getFullStart() + : firstImport.getStart(); + + str.appendRight(start + astOffset, '\n' + (hasModuleScript ? '\n' : '')); +} diff --git a/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts b/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts index e5861fdaa..f3d677213 100644 --- a/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts +++ b/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts @@ -11,7 +11,10 @@ import { ImplicitStoreValues } from './nodes/ImplicitStoreValues'; import { Generics } from './nodes/Generics'; import { is$$SlotsDeclaration } from './nodes/slot'; import { preprendStr } from '../utils/magic-string'; -import { handleImportDeclaration } from './nodes/handleImportDeclaration'; +import { + handleFirstInstanceImport, + handleImportDeclaration +} from './nodes/handleImportDeclaration'; export interface InstanceScriptProcessResult { exportedNames: ExportedNames; @@ -259,14 +262,7 @@ export function processInstanceScriptContent( implicitTopLevelNames.modifyCode(rootScope.declared); implicitStoreValues.modifyCode(astOffset, str); - const firstImport = tsAst.statements - .filter(ts.isImportDeclaration) - .sort((a, b) => a.end - b.end)[0]; - if (firstImport) { - // ensure it's in a newline. - // if file has module script ensure an empty line to separate imports - str.appendRight(firstImport.getStart() + astOffset, '\n' + (hasModuleScript ? '\n' : '')); - } + handleFirstInstanceImport(tsAst, astOffset, hasModuleScript, str); if (mode === 'dts') { // Transform interface declarations to type declarations because indirectly diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expected.tsx new file mode 100644 index 000000000..af30243a1 --- /dev/null +++ b/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expected.tsx @@ -0,0 +1,17 @@ +/// +<>;// non-leading comment +/**@typedef {{ a: string }} Foo */ + +import '' +function render() { + + + + + +; +() => (<>); +return { props: {}, slots: {}, getters: {}, events: {} }} + +export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { +} \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expectedv2.ts new file mode 100644 index 000000000..dc7df4291 --- /dev/null +++ b/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/expectedv2.ts @@ -0,0 +1,17 @@ +/// +;// non-leading comment +/**@typedef {{ a: string }} Foo */ + +import '' +function render() { + + + + + +; +async () => {}; +return { props: {}, slots: {}, getters: {}, events: {} }} + +export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { +} \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/input.svelte b/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/input.svelte new file mode 100644 index 000000000..85157c0e9 --- /dev/null +++ b/packages/svelte2tsx/test/svelte2tsx/samples/jsdoc-before-first-import/input.svelte @@ -0,0 +1,6 @@ + \ No newline at end of file