Skip to content

Commit 63677b3

Browse files
pezeyndu13
authored andcommitted
add same name model map
1 parent e9e2434 commit 63677b3

2 files changed

Lines changed: 74 additions & 0 deletions

File tree

lib/semantic.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,8 @@ class TypeChecker {
888888
ast.usedExternModel = this.usedExternModel;
889889
ast.usedExternException = this.resolveUsedExceptions(this.usedExternModel);
890890
ast.conflictModels = this.resolveConflictModels(ast.usedExternModel);
891+
ast.sameNameModels = this.getSameNameModels(ast.usedExternModel);
892+
ast.sameNameExceptions = this.getSameNameExceptions(ast.usedExternModel);
891893
ast.usedTypes = this.usedTypes;
892894
ast.innerDep = this.innerDep;
893895
ast.aliasNames = this.aliasNames;
@@ -968,6 +970,72 @@ class TypeChecker {
968970
return conflicts;
969971
}
970972

973+
getSameNameModels(usedExternModel) {
974+
var models = new Map();
975+
var names = new Map();
976+
for (const [name] of this.models) {
977+
const model = this.models.get(name);
978+
if (model && model.isException) {
979+
continue;
980+
}
981+
names.set(name, '');
982+
}
983+
for (const [moduleName] of usedExternModel) {
984+
const checker = this.dependencies.get(moduleName);
985+
for (var [name] of checker.models) {
986+
const model = checker.models.get(name);
987+
if (model && model.isException) {
988+
continue;
989+
}
990+
if (names.has(name)) {
991+
models.set(`${moduleName}:${name}`, true);
992+
const conflictModule = names.get(name);
993+
if (conflictModule) {
994+
models.set(`${conflictModule}:${name}`, true);
995+
} else {
996+
models.set(name, true);
997+
}
998+
999+
}
1000+
names.set(name, moduleName);
1001+
}
1002+
}
1003+
return models;
1004+
}
1005+
1006+
getSameNameExceptions(usedExternModel) {
1007+
var exceptions = new Map();
1008+
var names = new Map();
1009+
for (const [name] of this.models) {
1010+
const model = this.models.get(name);
1011+
if (model && !model.isException) {
1012+
continue;
1013+
}
1014+
names.set(name, '');
1015+
}
1016+
for (const [moduleName] of usedExternModel) {
1017+
const checker = this.dependencies.get(moduleName);
1018+
for (var name of checker.models) {
1019+
const model = checker.models.get(name);
1020+
if (model && !model.isException) {
1021+
continue;
1022+
}
1023+
if (names.has(name)) {
1024+
exceptions.set(`${moduleName}:${name}`, true);
1025+
const conflictModule = names.get(name);
1026+
if (conflictModule) {
1027+
exceptions.set(`${conflictModule}:${name}`, true);
1028+
} else {
1029+
exceptions.set(name, true);
1030+
}
1031+
1032+
}
1033+
names.set(name, moduleName);
1034+
}
1035+
}
1036+
return exceptions;
1037+
}
1038+
9711039
resolveUsedExceptions(usedExternModel) {
9721040
const exceptions = new Map();
9731041
for (const [moduleName, models] of usedExternModel) {

test/semantic.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4710,6 +4710,12 @@ describe('semantic', function () {
47104710
expect(ast.conflictModels.has('OSS:Config')).to.be(false);
47114711
});
47124712

4713+
it('conflict models should ok', function () {
4714+
let ast = readAndParse('fixtures/module_model_conflict/module_model_unuse.dara');
4715+
expect(ast.sameNameModels.has('OSS:Config')).to.be(true);
4716+
expect(ast.sameNameModels.has('Source:Config')).to.be(false);
4717+
});
4718+
47134719
it('used exceptions should ok', function () {
47144720
let ast = readAndParse('fixtures/module_exception_used/main.dara');
47154721
expect(ast.usedExternException.get('OSS').has('Err1')).to.be(true);

0 commit comments

Comments
 (0)