提交 a51e70f5 编写于 作者: fxy060608's avatar fxy060608

wip(uts): compiler

上级 0a8dd9e5
import { UIDevice } from 'UIKit'
type GetBatteryInfoOptions = {
success?: (res: UTSJSONObject) => void
fail?: (res: UTSJSONObject) => void
complete?: (res: UTSJSONObject) => void
}
export default async function getBatteryInfo(options: GetBatteryInfoOptions) {
const res = {
errMsg: 'getBatteryInfo:ok',
level: UIDevice.current.batteryLevel * 100,
isCharging: UIDevice.current.batteryState == UIDevice.BatteryState.charging,
}
if (options.success != null) {
options.success!(res)
}
if (options.complete != null) {
options.complete!(res)
}
}
import UIKit;
typealias GetBatteryInfoOptions = {
var success?: (_ res: UTSJSONObject) -> Void;
var fail?: (_ res: UTSJSONObject) -> Void;
var complete?: (_ res: UTSJSONObject) -> Void;
};
async func getBatteryInfo(_ options: GetBatteryInfoOptions) {
var res = [
"errMsg": "getBatteryInfo:ok",
"level": UIDevice.current.batteryLevel * 100,
"isCharging": UIDevice.current.batteryState == UIDevice.BatteryState.charging
];
if (options.success != nil) options.success!(res);
if (options.complete != nil) options.complete!(res);
}
{"version":3,"sources":["/Users/fxy/Projects/GitHub/uni-app/uni-app-next/packages/playground/uts/uni_modules/test-uniplugin/app-ios/index.uts"],"sourcesContent":["import { UIDevice } from 'UIKit'\n\ntype GetBatteryInfoOptions = {\n success?: (res: UTSJSONObject) => void\n fail?: (res: UTSJSONObject) => void\n complete?: (res: UTSJSONObject) => void\n}\n\nexport default async function getBatteryInfo(options: GetBatteryInfoOptions) {\n const res = {\n errMsg: 'getBatteryInfo:ok',\n level: UIDevice.current.batteryLevel * 100,\n isCharging: UIDevice.current.batteryState == UIDevice.BatteryState.charging,\n }\n if (options.success != null) {\n options.success!(res)\n }\n if (options.complete != null) {\n options.complete!(res)\n }\n}\n"],"names":[],"mappings":"AAAA;UAEK,qBAAqB;QACxB,OAAO,MAAI,GAAkB,EAAb,aAAa,KAAK,IAAI;QACtC,IAAI,MAAI,GAAkB,EAAb,aAAa,KAAK,IAAI;QACnC,QAAQ,MAAI,GAAkB,EAAb,aAAa,KAAK,IAAI;;AAG1B,WAAe,cAAc,CAAC,EAAA,OAA8B,EAArB,qBAAqB,EAAE;IAC3E,IAAM,GAAG,GAAG;QACV,CAAA,MAAM,GAAE,mBAAmB;QAC3B,CAAA,KAAK,GAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,GAAG,GAAG;QAC1C,CAAA,UAAU,GAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ;KAC5E;IACD,IAAI,OAAO,CAAC,OAAO,IAAI,GAAI,EACzB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;IAEvB,IAAI,OAAO,CAAC,QAAQ,IAAI,GAAI,EAC1B,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;AAE1B"}
\ No newline at end of file
import { isInHBuilderX, resolveSourceMapPath } from '@dcloudio/uni-cli-shared' import { isInHBuilderX, resolveSourceMapPath } from '@dcloudio/uni-cli-shared'
import { capitalize } from '@vue/shared'
import { genUTSPlatformResource, getUtsCompiler, resolvePackage } from './utils' import { genUTSPlatformResource, getUtsCompiler, resolvePackage } from './utils'
export function parseSwiftPackage(filename: string) { export function parseSwiftPackage(filename: string) {
...@@ -6,7 +7,7 @@ export function parseSwiftPackage(filename: string) { ...@@ -6,7 +7,7 @@ export function parseSwiftPackage(filename: string) {
if (!res) { if (!res) {
return '' return ''
} }
return 'UTSSDK' + (res.is_uni_modules ? 'Modules' : '') + res.name return 'UTSSDK' + (res.is_uni_modules ? 'Modules' : '') + capitalize(res.name)
} }
export async function compileSwift(filename: string) { export async function compileSwift(filename: string) {
...@@ -31,7 +32,7 @@ export async function compileSwift(filename: string) { ...@@ -31,7 +32,7 @@ export async function compileSwift(filename: string) {
outDir: outputDir, outDir: outputDir,
package: '', package: '',
sourceMap: resolveSourceMapPath(), sourceMap: resolveSourceMapPath(),
extname: 'kt', extname: 'swift',
imports: [], imports: [],
logFilename: true, logFilename: true,
noColor: isInHBuilderX(), noColor: isInHBuilderX(),
......
...@@ -44,11 +44,13 @@ export function genUTSPlatformResource( ...@@ -44,11 +44,13 @@ export function genUTSPlatformResource(
const utsOutputDir = resolveUTSPlatformDir(platformFile, platform) const utsOutputDir = resolveUTSPlatformDir(platformFile, platform)
// 拷贝所有非uts文件及目录 // 拷贝所有非uts文件及目录
fs.copySync(utsInputDir, utsOutputDir, { if (fs.existsSync(utsInputDir)) {
filter(src) { fs.copySync(utsInputDir, utsOutputDir, {
return path.extname(src) !== '.uts' filter(src) {
}, return path.extname(src) !== '.uts'
}) },
})
}
// 生产模式下,需要将 kt 文件转移到 src 下 // 生产模式下,需要将 kt 文件转移到 src 下
const srcDir = path.resolve(utsOutputDir, 'src') const srcDir = path.resolve(utsOutputDir, 'src')
......
...@@ -63,6 +63,16 @@ export function toKotlin(options: UtsOptions): Promise<UtsResult> { ...@@ -63,6 +63,16 @@ export function toKotlin(options: UtsOptions): Promise<UtsResult> {
.then((res: string) => JSON.parse(res)) .then((res: string) => JSON.parse(res))
} }
export function bundleKotlin(options: UtsBundleOptions): Promise<UtsResult> {
const bundleOptions = resolveOptions(options)
if (!bundleOptions) {
return Promise.resolve({})
}
return bindings
.bundleKotlin(toBuffer(bundleOptions))
.then((res: string) => res)
}
export function toSwift(options: UtsOptions): Promise<UtsResult> { export function toSwift(options: UtsOptions): Promise<UtsResult> {
const swiftOptions = resolveOptions(options) const swiftOptions = resolveOptions(options)
if (!swiftOptions) { if (!swiftOptions) {
...@@ -73,12 +83,14 @@ export function toSwift(options: UtsOptions): Promise<UtsResult> { ...@@ -73,12 +83,14 @@ export function toSwift(options: UtsOptions): Promise<UtsResult> {
.then((res: string) => JSON.parse(res)) .then((res: string) => JSON.parse(res))
} }
export function bundle(options: UtsBundleOptions): Promise<UtsResult> { export function bundleSwift(options: UtsBundleOptions): Promise<UtsResult> {
const bundleOptions = resolveOptions(options) const bundleOptions = resolveOptions(options)
if (!bundleOptions) { if (!bundleOptions) {
return Promise.resolve({}) return Promise.resolve({})
} }
return bindings.bundle(toBuffer(bundleOptions)).then((res: string) => res) return bindings
.bundleSwift(toBuffer(bundleOptions))
.then((res: string) => res)
} }
function toBuffer(t: any): Buffer { function toBuffer(t: any): Buffer {
......
...@@ -4,8 +4,9 @@ import glob from 'fast-glob' ...@@ -4,8 +4,9 @@ import glob from 'fast-glob'
import chokidar from 'chokidar' import chokidar from 'chokidar'
import { toKotlin, toSwift } from './api' import { bundleKotlin, bundleSwift, toKotlin, toSwift } from './api'
import { import {
UtsBundleOptions,
UtsInputOptions, UtsInputOptions,
UtsOptions, UtsOptions,
UtsOutputOptions, UtsOutputOptions,
...@@ -316,7 +317,16 @@ function buildFile( ...@@ -316,7 +317,16 @@ function buildFile(
}) })
} }
export { parse, bundle } from './api' export { parse, bundleKotlin, bundleSwift } from './api'
export function bundle(target: UtsTarget, opts: UtsBundleOptions) {
if (target === UtsTarget.KOTLIN) {
return bundleKotlin(opts)
} else if (target === UtsTarget.SWIFT) {
return bundleSwift(opts)
}
return Promise.resolve({})
}
export function runDev(target: UtsTarget, opts: ToOptions) { export function runDev(target: UtsTarget, opts: ToOptions) {
opts = parseOptions('dev', target, opts) opts = parseOptions('dev', target, opts)
......
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const { parse, bundle } = require('../packages/uts/dist') const { parse, bundle, UtsTarget } = require('../packages/uts/dist')
const projectDir = path.resolve(__dirname, '../packages/playground/uts') const projectDir = path.resolve(__dirname, '../packages/playground/uts')
let start = Date.now() const start = Date.now()
parse( parse(
fs.readFileSync( fs.readFileSync(
path.resolve( path.resolve(
...@@ -16,33 +16,74 @@ parse( ...@@ -16,33 +16,74 @@ parse(
console.log('parse: ' + (Date.now() - start) + 'ms') console.log('parse: ' + (Date.now() - start) + 'ms')
console.log(JSON.stringify(res)) console.log(JSON.stringify(res))
}) })
start = Date.now() function testKotlin() {
bundle({ const start = Date.now()
input: { return bundle(UtsTarget.KOTLIN, {
root: projectDir, input: {
filename: path.resolve( root: projectDir,
projectDir, filename: path.resolve(
'uni_modules/test-uniplugin/app-android/index.uts'
),
},
output: {
outDir: path.resolve(projectDir, 'unpackage/dist/app'),
package: 'uts.modules.testUniPlugin',
imports: ['kotlinx.coroutines.*', 'io.dcloud.uts.runtime.*'],
sourceMap: true,
extname: 'kt',
logFilename: true,
},
}).then((res) => {
console.log('bundle: ' + (Date.now() - start) + 'ms')
console.log(JSON.stringify(res))
console.log(
fs.readFileSync(
path.resolve(
projectDir, projectDir,
'unpackage/dist/app/uni_modules/test-uniplugin/app-android/index.kt' 'uni_modules/test-uniplugin/app-android/index.uts'
), ),
'utf8' },
output: {
outDir: path.resolve(projectDir, 'unpackage/dist/app'),
package: 'uts.modules.testUniPlugin',
imports: ['kotlinx.coroutines.*', 'io.dcloud.uts.runtime.*'],
sourceMap: true,
extname: 'kt',
logFilename: true,
},
}).then((res) => {
console.log('bundle: ' + (Date.now() - start) + 'ms')
console.log(JSON.stringify(res))
console.log(
fs.readFileSync(
path.resolve(
projectDir,
'unpackage/dist/app/uni_modules/test-uniplugin/app-android/index.kt'
),
'utf8'
)
) )
) })
}) }
function testSwift() {
const start = Date.now()
return bundle(UtsTarget.SWIFT, {
input: {
root: projectDir,
filename: path.resolve(
projectDir,
'uni_modules/test-uniplugin/app-ios/index.uts'
),
},
output: {
outDir: path.resolve(projectDir, 'unpackage/dist/app'),
package: 'uts.modules.testUniPlugin',
sourceMap: true,
extname: 'swift',
logFilename: true,
},
}).then((res) => {
console.log('bundle: ' + (Date.now() - start) + 'ms')
console.log(JSON.stringify(res))
console.log(
fs.readFileSync(
path.resolve(
projectDir,
'unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift'
),
'utf8'
)
)
})
}
async function test() {
await testKotlin()
await testSwift()
}
test()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册