Compare commits

..

3 Commits

Author SHA1 Message Date
df339df94d Reflect types into properties on top-level symbols as well. (#4)
Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
Reviewed-on: #4
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2024-10-21 16:57:59 +00:00
b9675c6d59 chore: inject the reflected type information inside the .ship() occurrences 2024-10-14 23:54:43 -07:00
ad5fd99f53 chore: add reflected type information to the .js files in ./build 2024-10-14 23:54:37 -07:00
7 changed files with 34 additions and 13 deletions

View File

@ -125,7 +125,7 @@ export function common<T>() {
return dep.divideReal(num, denom)
}
})
.done()
.ship()
}
// 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))
})
.done()
.ship()
}

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))
}).done()
}).ship()
}
export function common<T>() {
@ -68,5 +68,5 @@ export function common<T>() {
.dependent(baseSignature({re: {}}), {
re: dep => z => dep.re(z.re)
})
.done()
.ship()
}

View File

@ -139,7 +139,7 @@ interface ImplementationBuilder<
Specs & {[K in NewKeys]: DepCheck<RD, Signatures>}
>
done(info?: ReflectedTypeInfo): Implementations<Signatures, NeedKeys, NeedList, Specs> & ReflectedTypeInfo
ship(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>}
>
},
done(info?: ReflectedTypeInfo) {
ship(info?: ReflectedTypeInfo) {
return { ...sofar, ...info }
}
}

View File

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

View File

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

View File

@ -20,17 +20,39 @@ function reflectType5(srcFile, options = { debug: false }) {
log(`=========Reflecting file "${relative(__dirname, srcFile)}"`)
const defFile = srcFile.replace(/.js$/, '.d.ts')
let src = String(readFileSync(srcFile))
const 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])
src += `\n${id}._reflectedType5 = ${JSON.stringify(parsedDefs[id])}\n`
srcReflected +=
`\n${id}._reflectedType5 = ${JSON.stringify(parsedDefs[id])}\n`
}
writeFileSync(srcFile, src)
writeFileSync(srcFile, srcReflected)
function log(...args) {
if (options.debug) {

View File

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