Skip to content

Commit

Permalink
Rework ts-for-gir lib to use gi.ts parsing and transformations
Browse files Browse the repository at this point in the history
  • Loading branch information
ewlsh committed Nov 7, 2023
1 parent 68b651e commit 5aba918
Show file tree
Hide file tree
Showing 44 changed files with 2,742 additions and 4,410 deletions.
3 changes: 3 additions & 0 deletions .ts-for-gir.gio.rc.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ export default {
girDirectories: ['./vala-girs/gir-1.0'],
ignore: [],
promisify: true,
verbose: true,
package: true,
outdir: './types',
}
5 changes: 3 additions & 2 deletions packages/cli/src/commands/doc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const handler = async (args: ConfigFlags) => {
if (config.environments[i]) {
const generateConfig = Config.getGenerateConfig(config, config.environments[i])
const moduleLoader = new ModuleLoader(generateConfig)
const { keep, grouped } = await moduleLoader.getModulesResolved(
const { keep } = await moduleLoader.getModulesResolved(
config.modules,
config.ignore || [],
config.ignoreVersionConflicts,
Expand All @@ -41,10 +41,11 @@ const handler = async (args: ConfigFlags) => {
return Logger.error(ERROR_NO_MODULES_FOUND(config.girDirectories))
}
const tsForGir = new GenerationHandler(generateConfig, GeneratorType.HTML_DOC)
const registry = moduleLoader.dependencyManager.registry

await tsForGir.start(
Array.from(keep).map((girModuleResolvedBy) => girModuleResolvedBy.module),
Object.values(grouped),
registry,
)
}
}
Expand Down
25 changes: 22 additions & 3 deletions packages/cli/src/commands/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ import { GeneratorType } from '@ts-for-gir/generator-base'
import { GenerationHandler } from '../generation-handler.js'
import { Config } from '../config.js'
import { ModuleLoader } from '../module-loader.js'
import prettier from 'prettier'

import type { ConfigFlags } from '@ts-for-gir/lib'
import { Formatter } from '@ts-for-gir/lib/lib/newlib/lib.js'

const command = 'generate [modules..]'

Expand All @@ -31,7 +33,7 @@ const handler = async (args: ConfigFlags) => {
for (const env of config.environments) {
const generateConfig = Config.getGenerateConfig(config, env)
const moduleLoader = new ModuleLoader(generateConfig)
const { keep, grouped } = await moduleLoader.getModulesResolved(
const { keep } = await moduleLoader.getModulesResolved(
config.modules,
config.ignore || [],
config.ignoreVersionConflicts,
Expand All @@ -42,9 +44,10 @@ const handler = async (args: ConfigFlags) => {
const tsForGir = new GenerationHandler(generateConfig, GeneratorType.TYPES)

const girModules = Array.from(keep).map((girModuleResolvedBy) => girModuleResolvedBy.module)
const girModulesGrouped = Object.values(grouped)
// const girModulesGrouped = Object.values(grouped)

await tsForGir.start(girModules, girModulesGrouped)
moduleLoader.dependencyManager.registry.registerFormatter('dts', new TypeScriptFormatter())
await tsForGir.start(girModules, moduleLoader.dependencyManager.registry)
}
}

Expand All @@ -64,6 +67,22 @@ const examples: ReadonlyArray<[string, string?]> = [
],
]

class TypeScriptFormatter extends Formatter {
format(input: string): Promise<string> {
try {
return prettier.format(input, {
parser: 'typescript',
printWidth: 120,
tabWidth: 4,
})
} catch (error) {
console.error('Failed to format output...')
console.error(input)
throw error
}
}
}

export const generate = {
command,
description,
Expand Down
2 changes: 2 additions & 0 deletions packages/cli/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,8 @@ export class Config {
npmScope: config.npmScope,
package: config.package,
packageYarn: config.packageYarn,
noPrettyPrint: false,
noAdvancedVariants: true,
}
return generateConfig
}
Expand Down
21 changes: 14 additions & 7 deletions packages/cli/src/generation-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ import {
} from '@ts-for-gir/lib'
import { GeneratorType, Generator } from '@ts-for-gir/generator-base'
import { TypeDefinitionGenerator } from '@ts-for-gir/generator-typescript'
import { HtmlDocGenerator } from '@ts-for-gir/generator-html-doc'
// import { HtmlDocGenerator } from '@ts-for-gir/generator-html-doc'

import type { InheritanceTable, GenerateConfig, GirModulesGrouped } from '@ts-for-gir/lib'
import type { InheritanceTable, GenerateConfig, NSRegistry } from '@ts-for-gir/lib'

export class GenerationHandler {
log: Logger
generator: Generator

constructor(
private readonly config: GenerateConfig,
type: GeneratorType,
Expand All @@ -27,9 +28,9 @@ export class GenerationHandler {
case GeneratorType.TYPES:
this.generator = new TypeDefinitionGenerator(config)
break
case GeneratorType.HTML_DOC:
this.generator = new HtmlDocGenerator(config)
break
// case GeneratorType.HTML_DOC:
// this.generator = new HtmlDocGenerator(config)
// break
default:
throw new Error('Unknown Generator')
}
Expand All @@ -48,7 +49,7 @@ export class GenerationHandler {
}
}

public async start(girModules: GirModule[], girModulesGrouped: GirModulesGrouped[]): Promise<void> {
public async start(girModules: GirModule[], registry: NSRegistry): Promise<void> {
this.log.info(START_MODULE(this.config.environment, this.config.buildType))

if (girModules.length == 0) {
Expand All @@ -74,7 +75,13 @@ export class GenerationHandler {
girModule.start(girModules)
}

await this.generator.start(girModules, girModulesGrouped, inheritanceTable)
await this.generator.start(registry)

for (const girModule of girModules) {
await this.generator.generate(registry, girModule)
}

await this.generator.finish(registry)

this.log.success(GENERATING_TYPES_DONE)
}
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/module-loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ export class ModuleLoader {
this.log.log(`Parsing ${dependency.path}...`)
const fileContents = await readFile(dependency.path, 'utf8')
const result = parser.parseGir(fileContents)
const girModule = new GirModule(result, this.config)
const girModule = GirModule.load(result, this.config, this.dependencyManager.registry)
// Figure out transitive module dependencies
this.extendDependencyMapByGirModule(girModule)
return girModule
Expand Down
10 changes: 4 additions & 6 deletions packages/generator-base/src/generator.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import type { InheritanceTable, GirModulesGrouped, GirModule } from '@ts-for-gir/lib'
import type { GirModule, NSRegistry } from '@ts-for-gir/lib'

export interface Generator {
start(
girModules: GirModule[],
girModulesGrouped: GirModulesGrouped[],
inheritanceTable: InheritanceTable,
): Promise<void>
start(registry: NSRegistry): Promise<void>
generate(registry: NSRegistry, module: GirModule): Promise<void>
finish(registry: NSRegistry): Promise<void>
}
Loading

0 comments on commit 5aba918

Please sign in to comment.