Compare commits
4 Commits
feat/refle
...
main
Author | SHA1 | Date | |
---|---|---|---|
3bc55fc3e0 | |||
75a950e830 | |||
2a8823c5f7 | |||
59c325ff6c |
@ -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()
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
@ -23,4 +23,4 @@ export const common = implementations<CommonSignature<number>>()
|
||||
return dep.complex(0, Math.sqrt(-a))
|
||||
}
|
||||
}})
|
||||
.ship()
|
||||
.done()
|
||||
|
@ -28,4 +28,4 @@ export const common = implementations<CommonSignature<number>>()
|
||||
one: a => 1,
|
||||
nan: a => NaN,
|
||||
re: a => a
|
||||
}).ship()
|
||||
}).done()
|
||||
|
@ -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) {
|
||||
|
@ -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))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user