Skip to content

Commit cb106b8

Browse files
committed
[WIP] feature: merge part files into one dart file.
1 parent 61581fe commit cb106b8

File tree

3 files changed

+68
-29
lines changed

3 files changed

+68
-29
lines changed

lib/main.js

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ try {
1212
console.log('NodeJS version is too low. Running on slow mode.')
1313
}
1414

15-
15+
let dnPartExtension = 'dnpart'
1616
var outputDir
1717
var projectName
1818
var packageSet = new Set()
@@ -58,9 +58,40 @@ function recFindByExt(base, ext, files, result) {
5858

5959
function writeOutputToFileByPath(result, srcPath) {
6060
var srcFile = srcPath.substr(srcPath.lastIndexOf('/') + 1)
61-
var dartFile = srcFile.substring(0, srcFile.indexOf('.')).toLowerCase() + '.dart'
61+
var components
62+
if (srcFile.endsWith(dnPartExtension)) {
63+
partExtension = srcFile.split('.').slice(-2).join('.')
64+
components = srcFile.split('.').slice(0, -3)
65+
components.push('dart')
66+
components.push(partExtension)
67+
} else {
68+
components = srcFile.split('.').slice(0, -1)
69+
components.push('dart')
70+
}
71+
72+
let dartFile = components.join('.').toLowerCase()
73+
6274
var outputFile = outputDir ? path.join(outputDir, dartFile) : dartFile
6375
fs.writeFileSync(outputFile, result)
76+
return outputFile
77+
}
78+
79+
function mergeFiles(filePaths) {
80+
if (!filePaths || filePaths.length <= 1) {
81+
return
82+
}
83+
84+
let result = filePaths.sort().map(filePath => {
85+
if (!filePath) {
86+
return ''
87+
}
88+
return fs.readFileSync(filePath, { encoding: 'utf8' })
89+
}).join('\n')
90+
let mergedFilePath = filePaths[0].split('.').slice(0, -2).join('.')
91+
fs.writeFileSync(mergedFilePath, result)
92+
filePaths.forEach((filePath) => {
93+
fs.unlinkSync(filePath)
94+
})
6495
}
6596

6697
function formatDartFile(dartPath) {
@@ -74,7 +105,7 @@ function createFlutterPackage(template, projectName) {
74105
}
75106

76107
function writeDependencyToPubSpec(filePath) {
77-
var doc = yaml.safeLoad(fs.readFileSync(filePath, 'utf8'));
108+
var doc = yaml.safeLoad(fs.readFileSync(filePath, 'utf8'))
78109
packageSet.forEach(item => {
79110
if (typeof (item) == "undefined") {
80111
return
@@ -85,20 +116,20 @@ function writeDependencyToPubSpec(filePath) {
85116
fs.writeFileSync(filePath, yaml.safeDump(doc).replace(/null/g, ''))
86117
}
87118

88-
function generateDartWithWorker(path, script) {
119+
function generateDartWithWorker(content, path, script) {
89120
return new Promise((resolve, reject) => {
90121
if (this.isMainThread) {
91122
const convert = require(script).convert
92-
convert(path, (result, path, error) => {
93-
resolve({ result: result, path: path, error: error })
123+
convert(content, (result, error) => {
124+
resolve({ result: result, error: error })
94125
})
95126
} else {
96127
const worker = new Worker(script, {
97-
workerData: { path: path },
128+
workerData: { content: content },
98129
resourceLimits: { maxOldGenerationSizeMb: 8 * 1024 }
99-
});
100-
worker.on("message", resolve);
101-
worker.on("error", reject);
130+
})
131+
worker.on("message", resolve)
132+
worker.on("error", reject)
102133
}
103134
}).then((msg) => {
104135
if (msg.error) {
@@ -108,13 +139,15 @@ function generateDartWithWorker(path, script) {
108139
if (!result) {
109140
return
110141
}
111-
writeOutputToFileByPath(result.dartCode, msg.path)
142+
143+
let dartFilePath = writeOutputToFileByPath(result.dartCode, path)
112144

113145
if (projectName) {
114146
result.packages.forEach(item => packageSet.add(item))
115147
}
116-
});
117-
};
148+
return dartFilePath
149+
})
150+
}
118151

119152
function splitCodeFileIfNeed(separator, maxLength, path) {
120153
const content = rf.readFileSync(path, "utf-8")
@@ -131,16 +164,23 @@ function splitCodeFileIfNeed(separator, maxLength, path) {
131164
}
132165

133166
async function runWorkItems(workItems) {
134-
const promises = Array.from(workItems.keys()).map((path) => {
135-
let script = workItems.get(path)
136-
console.log('processing: ' + path)
167+
const promises = Array.from(workItems.keys()).map((filePath) => {
168+
let script = workItems.get(filePath)
169+
console.log('processing: ' + filePath)
137170
// TODO: change separator
138-
let contents = splitCodeFileIfNeed("@end\n", 5000, path)
139-
let ps = contents.map((content) => {
140-
return generateDartWithWorker(content, script)
171+
let contents = splitCodeFileIfNeed("@end\n", 5000, filePath)
172+
let ps = contents.map((content, index) => {
173+
let p = filePath
174+
if (contents.length > 1) {
175+
p = `${filePath}.${index}.${dnPartExtension}`
176+
}
177+
return generateDartWithWorker(content, p, script)
141178
})
142-
return ps
143-
}).reduce((acc, val) => acc.concat(val), []);
179+
return Promise.all(ps).then((results) => {
180+
// merge files
181+
mergeFiles(results)
182+
})
183+
})
144184
await Promise.all(promises)
145185
}
146186

lib/objc/DNObjectiveCConverter.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ function convert(content, cb) {
1717
if (!content) {
1818
if (!workerData) {
1919
if (cb) {
20-
cb(null, null, null)
20+
cb(null, null)
2121
}
2222
return
2323
}
@@ -36,16 +36,16 @@ function convert(content, cb) {
3636
const parser = new ObjectiveCParser(tokens)
3737
parser.addErrorListener(errorListener)
3838
const tree = parser.translationUnit()
39-
const listener = new DNObjectiveCParserListener(cb, content)
39+
const listener = new DNObjectiveCParserListener(cb)
4040
antlr4.tree.ParseTreeWalker.DEFAULT.walk(listener, tree)
4141
} catch (e) {
42-
cb(null, content, e)
42+
cb(null, e)
4343
}
4444
}
4545

46-
function callback(result, path, error) {
46+
function callback(result, error) {
4747
// Send a message to the main thread.
48-
parentPort.postMessage({result: result, path: path, error: error});
48+
parentPort.postMessage({result: result, error: error});
4949
}
5050

5151
convert()

lib/objc/DNObjectiveCParserListener.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,16 @@ let DNRootContext = c.DNRootContext,
2020

2121
// This class defines a complete listener for a parse tree produced by ObjectiveCParser.
2222
class DNObjectiveCParserListener extends ObjectiveCParserListener {
23-
constructor(cb, path) {
23+
constructor(cb) {
2424
super()
2525
ObjectiveCParserListener.call(this)
2626
//success callack
2727
this.cb = cb
28-
this.path = path
2928
}
3029

3130
buildDart() {
3231
var dart = this.rootContext.parse()
33-
this.cb(dart, this.path, null)
32+
this.cb(dart, null)
3433
}
3534

3635
// Enter a parse tree produced by ObjectiveCParser#translationUnit.

0 commit comments

Comments
 (0)