Skip to content

Commit

Permalink
feat: show reports in matches view
Browse files Browse the repository at this point in the history
  • Loading branch information
jedwards1211 committed Oct 17, 2023
1 parent a8f8b22 commit dabc6db
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 28 deletions.
5 changes: 4 additions & 1 deletion src/AstxRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export type TransformResultEvent = {
file: vscode.Uri
source: string
transformed?: string
reports?: unknown[]
matches: readonly IpcMatch[]
error?: Error
}
Expand Down Expand Up @@ -234,7 +235,7 @@ export class AstxRunner extends TypedEmitter<AstxRunnerEvents> {
continue
}
const {
result: { file, source = '', transformed, matches, error },
result: { file, source = '', transformed, matches, reports, error },
} = next
if (transformed) {
this.transformResults.set(file, {
Expand All @@ -244,6 +245,7 @@ export class AstxRunner extends TypedEmitter<AstxRunnerEvents> {
}
if (
!matches?.length &&
!reports?.length &&
!error &&
(transformed == null || transformed === source)
) {
Expand All @@ -253,6 +255,7 @@ export class AstxRunner extends TypedEmitter<AstxRunnerEvents> {
file: vscode.Uri.file(file),
source,
transformed,
reports,
matches: matches || [],
error: error ? this.astxNode.invertIpcError(error) : null,
}
Expand Down
39 changes: 26 additions & 13 deletions src/MatchesView/FileNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ import MatchNode from './MatchNode'
import path from 'path'
import { once } from 'lodash-es'
import LeafTreeItemNode from './LeafTreeItemNode'
import { ASTX_RESULT_SCHEME } from '../constants'
import { ASTX_REPORTS_SCHEME, ASTX_RESULT_SCHEME } from '../constants'

export type FileNodeProps = {
file: Uri
source: string
transformed?: string
reports?: readonly unknown[]
matches: readonly IpcMatch[]
error?: Error
}
Expand All @@ -30,10 +31,10 @@ export default class FileNode extends TreeNode<FileNodeProps> {
return error.stack || error.message || String(error)
}
getTreeItem(): TreeItem {
const { file, transformed, matches } = this.props
const { file, transformed, reports, matches } = this.props
const item = new TreeItem(
file.with({ scheme: ASTX_RESULT_SCHEME }),
matches.length
matches.length || reports?.length
? TreeItemCollapsibleState.Expanded
: TreeItemCollapsibleState.None
)
Expand Down Expand Up @@ -82,22 +83,34 @@ export default class FileNode extends TreeNode<FileNodeProps> {
getChildren: () => TreeNode[] = once((): TreeNode[] => {
const {
errorMessage,
props: { matches },
props: { file, matches, reports },
} = this
if (errorMessage) {
const message = errorMessage.split(/\r\n?|\n/gm)
return message.map(
(line) => new LeafTreeItemNode({ item: new TreeItem(line) })
)
}
return matches.map(
(match) =>
new MatchNode(
{
match,
},
this
)
)
let reportsItem: TreeItem | undefined
if (reports?.length) {
reportsItem = new TreeItem('Reports')
reportsItem.command = {
title: 'open reports',
command: 'vscode.open',
arguments: [file.with({ scheme: ASTX_REPORTS_SCHEME })],
}
}
return [
...(reportsItem ? [new LeafTreeItemNode({ item: reportsItem })] : []),
...matches.map(
(match) =>
new MatchNode(
{
match,
},
this
)
),
]
})
}
7 changes: 6 additions & 1 deletion src/MatchesView/MatchesViewProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,12 @@ export class MatchesViewProvider implements vscode.TreeDataProvider<TreeNode> {
if (!forFolder) {
this.folders.set(workspaceFolder, (forFolder = { files: [] }))
}
if (event.matches?.length || event.error || event.transformed) {
if (
event.matches?.length ||
event.reports?.length ||
event.error ||
event.transformed
) {
forFolder.files.push(event)
}
this.fireChange()
Expand Down
35 changes: 24 additions & 11 deletions src/TransformResultProvider.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CodeFrameError } from 'astx'
import * as vscode from 'vscode'
import { TransformResultEvent } from './AstxRunner'
import { ASTX_RESULT_SCHEME } from './constants'
import { ASTX_REPORTS_SCHEME, ASTX_RESULT_SCHEME } from './constants'
import { AstxExtension } from './extension'

export default class TransformResultProvider
Expand Down Expand Up @@ -30,7 +30,7 @@ export default class TransformResultProvider
})
runner.on('result', (event: TransformResultEvent) => {
const { file } = event
const uri = file.with({ scheme: ASTX_RESULT_SCHEME })
const uri = file.with({ scheme: 'file' })
this.results.set(uri.toString(), event)
for (const listener of this.contentListeners) listener(uri)
for (const listener of this.decorationListeners) listener(uri)
Expand All @@ -43,16 +43,29 @@ export default class TransformResultProvider
}

provideTextDocumentContent(uri: vscode.Uri): string {
const { transformed, error } = this.results.get(uri.toString()) || {}
if (transformed) return transformed
if (error) {
if (error instanceof CodeFrameError) {
return error.format({
highlightCode: true,
stack: true,
})
const result = this.results.get(uri.with({ scheme: 'file' }).toString())
switch (uri.scheme) {
case ASTX_RESULT_SCHEME: {
const transformed = result?.transformed
if (transformed) return transformed
const error = result?.error

if (error) {
if (error instanceof CodeFrameError) {
return error.format({
highlightCode: true,
stack: true,
})
}
return error.stack || error.message || String(error)
}
break
}
case ASTX_REPORTS_SCHEME: {
return (result?.reports || [])
?.map((report) => JSON.stringify(report, null, 2))
.join('\n')
}
return error.stack || error.message || String(error)
}
return ''
}
Expand Down
1 change: 1 addition & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export const ASTX_RESULT_SCHEME = 'astx-result'
export const ASTX_REPORTS_SCHEME = 'astx-reports'
8 changes: 6 additions & 2 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode'
import { AstxRunner, Params } from './AstxRunner'
import { ASTX_RESULT_SCHEME } from './constants'
import { ASTX_REPORTS_SCHEME, ASTX_RESULT_SCHEME } from './constants'
import { MatchesViewProvider } from './MatchesView/MatchesViewProvider'
import { SearchReplaceViewProvider } from './SearchReplaceView/SearchReplaceViewProvider'
import TransformResultProvider from './TransformResultProvider'
import type * as AstxNodeTypes from 'astx/node'
import fs from 'fs-extra'
import path, { resolve } from 'path'
import path from 'path'

let extension: AstxExtension

Expand Down Expand Up @@ -177,6 +177,10 @@ export class AstxExtension {
vscode.workspace.registerTextDocumentContentProvider(
ASTX_RESULT_SCHEME,
this.transformResultProvider
),
vscode.workspace.registerTextDocumentContentProvider(
ASTX_REPORTS_SCHEME,
this.transformResultProvider
)
)

Expand Down

0 comments on commit dabc6db

Please sign in to comment.