Compare commits

..

4 Commits

Author SHA1 Message Date
3bc55fc3e0 refactor: Rename ship() to done() (#9)
Resolves #7.

Reviewed-on: #9
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2024-10-21 22:02:35 +00:00
75a950e830 chore: Remove string-based type injection via ship() (#8)
Resolves #6.

Reviewed-on: #8
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2024-10-21 21:46:52 +00:00
2a8823c5f7 fix: ts2json not working on Windows 2024-10-21 20:22:31 +02:00
59c325ff6c feat: Try two different kinds of type reflection (#5)
Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
Reviewed-on: #5
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2024-10-21 17:00:58 +00:00
7 changed files with 13 additions and 34 deletions

View File

@ -125,7 +125,7 @@ export function common<T>() {
return dep.divideReal(num, denom)
}
})
.ship()
.done()
}
// Additional implementations for non-uniform signatures
@ -148,5 +148,5 @@ export function mixed<T>() {
divide: dep => (z, r) =>
dep.complex(dep.divTR(z.re, r), dep.divTR(z.im, r))
})
.ship()
.done()
}

View File

@ -48,7 +48,7 @@ export function lift<T>() {
return implementations<CommonSignature<T>>()
.dependent({zero: {}}, {
complex: dep => (a, b) => cplex(a, b || dep.zero(a))
}).ship()
}).done()
}
export function common<T>() {
@ -68,5 +68,5 @@ export function common<T>() {
.dependent(baseSignature({re: {}}), {
re: dep => z => dep.re(z.re)
})
.ship()
.done()
}

View File

@ -139,7 +139,7 @@ interface ImplementationBuilder<
Specs & {[K in NewKeys]: DepCheck<RD, Signatures>}
>
ship(info?: ReflectedTypeInfo): Implementations<Signatures, NeedKeys, NeedList, Specs> & ReflectedTypeInfo
done(info?: ReflectedTypeInfo): Implementations<Signatures, NeedKeys, NeedList, Specs> & ReflectedTypeInfo
}
// And a function that actually provides the builder interface:
@ -191,7 +191,7 @@ function impBuilder<
Specs & {[K in NewKeys]: DepCheck<RD, Signatures, DepKeys>}
>
},
ship(info?: ReflectedTypeInfo) {
done(info?: ReflectedTypeInfo) {
return { ...sofar, ...info }
}
}

View File

@ -23,4 +23,4 @@ export const common = implementations<CommonSignature<number>>()
return dep.complex(0, Math.sqrt(-a))
}
}})
.ship()
.done()

View File

@ -28,4 +28,4 @@ export const common = implementations<CommonSignature<number>>()
one: a => 1,
nan: a => NaN,
re: a => a
}).ship()
}).done()

View File

@ -20,39 +20,17 @@ function reflectType5(srcFile, options = { debug: false }) {
log(`=========Reflecting file "${relative(__dirname, srcFile)}"`)
const defFile = srcFile.replace(/.js$/, '.d.ts')
const src = String(readFileSync(srcFile))
let src = String(readFileSync(srcFile))
const defs = String(readFileSync(defFile))
const parsedDefs = ts2json(defFile)
const typeDefMatches = defs.matchAll(/: ({(?:(?!\n}).)+\n}) & (?:(?!ReflectedTypeInfo).)+ReflectedTypeInfo/gs)
if (!typeDefMatches) {
log('No ReflectedTypeInfo found.')
return
}
const typeDefs = Array.from(typeDefMatches).map(def => def[1])
log(` ${typeDefs.length} ReflectedTypeInfo found`)
let index = 0
let srcReflected = src.replaceAll(/(\s*)\.ship\(\)/g, () => {
const def = typeDefs[index]
index++
return `.ship({ reflectedType5: \`${def}\` })`
})
log(` ReflectedTypeInfo injected in ${index} occurrences of .ship()`)
if (index !== typeDefs.length) {
log(' WARNING: not all ReflectedTypeInfo occurrences could be injected')
}
for (const id in parsedDefs) {
if (id.includes('interface')) continue
if (parsedDefs[id] === undefined) continue
log(` Tagging ${id} with type data`, parsedDefs[id])
srcReflected +=
`\n${id}._reflectedType5 = ${JSON.stringify(parsedDefs[id])}\n`
src += `\n${id}._reflectedType5 = ${JSON.stringify(parsedDefs[id])}\n`
}
writeFileSync(srcFile, srcReflected)
writeFileSync(srcFile, src)
function log(...args) {
if (options.debug) {

View File

@ -225,7 +225,8 @@ export default function(filename, options = {}) {
let program = ts.createProgram([filename], options)
let checker = program.getTypeChecker()
const sourceFiles = program.getSourceFiles()
let sourceFile = sourceFiles.find(file => file.fileName === filename)
const filenameUnix = filename.replaceAll('\\', '/')
let sourceFile = sourceFiles.find(file => file.fileName === filenameUnix)
ts.forEachChild(sourceFile, visit(node, checker))